blob: 1f78e6b9e076f0a46bf3efdcf542a0e571bd7daa [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:annotation>
<xs:documentation>
This schema describes the format of the XML files, that describe the ZCL specification.
(c) Copyright 2012, 2021, Silicon Laboratories Inc.
</xs:documentation>
</xs:annotation>
<xs:simpleType name="integerWithHex">
<xs:restriction base="xs:string">
<xs:pattern value="[-+]?(0x[0-9A-Fa-f]+|[0-9]+)"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="uIntegerWithHex">
<xs:restriction base="xs:string">
<xs:pattern value="(0x[0-9A-Fa-f]+|[0-9]+)"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="access">
<xs:attribute name="op" type="xs:string"/>
<xs:attribute name="role" type="xs:string"/>
<xs:attribute name="privilege" type="xs:string"/>
<xs:attribute name="modifier" type="xs:string"/>
</xs:complexType>
<xs:complexType name="eventField">
<xs:attribute name="id" use="required" type="uIntegerWithHex"/>
<xs:attribute name="name" use="required" type="xs:string"/>
<xs:attribute name="type" use="required" type="xs:string"/>
<xs:attribute name="array" type="xs:boolean"/>
<xs:attribute name="isNullable" type="xs:boolean"/>
<xs:attribute name="optional" type="xs:boolean" default="false"/>
<xs:attribute name="min" type="integerWithHex"/>
<xs:attribute name="max" type="integerWithHex"/>
</xs:complexType>
<xs:complexType name="tag">
<xs:attribute name="name" use="required" type="xs:string"/>
<xs:attribute name="description" use="required" type="xs:string"/>
</xs:complexType>
<xs:complexType name="arg">
<xs:attribute name="id" type="uIntegerWithHex" />
<xs:attribute name="min" type="integerWithHex"/>
<xs:attribute name="max" type="integerWithHex"/>
<xs:attribute name="arrayLength" type="xs:boolean"/>
<xs:attribute name="array" type="xs:boolean"/>
<xs:attribute name="default" type="xs:string"/>
<xs:attribute name="description" type="xs:string"/>
<xs:attribute name="introducedIn" type="zclSpecVersion"/>
<xs:attribute name="removedIn" type="zclSpecVersion"/>
<xs:attribute name="name" use="required"/>
<xs:attribute name="type" use="required"/>
<xs:attribute name="length" type="xs:int"/>
<xs:attribute name="presentIf" type="xs:string"/>
<xs:attribute name="optional" type="xs:boolean"/>
<xs:attribute name="fieldId" type="integerWithHex"/>
<xs:attribute name="countArg" type="xs:string" />
<xs:attribute name="isNullable" type="xs:boolean"/>
</xs:complexType>
<xs:complexType name="clusterRef">
<xs:attribute name="code" type="xs:string"/>
</xs:complexType>
<xs:complexType name="item">
<xs:attribute name="introducedIn" type="zclSpecVersion"/>
<xs:attribute name="name" use="required" type="xs:string"/>
<xs:attribute name="type" type="xs:string"/>
<xs:attribute name="value" type="xs:string"/>
<xs:attribute name="array" type="xs:boolean"/>
<xs:attribute name="enum" type="xs:boolean"/>
<xs:attribute name="fieldId" type="integerWithHex"/>
<xs:attribute name="min" type="integerWithHex"/>
<xs:attribute name="max" type="integerWithHex"/>
<xs:attribute name="length" type="integerWithHex"/>
<xs:attribute name="default" type="xs:string"/>
<xs:attribute name="isNullable" type="xs:boolean"/>
<xs:attribute name="optional" type="xs:boolean" default="false"/>
</xs:complexType>
<xs:complexType name="featureBit" mixed="true">
<xs:attribute name="tag" use="required" type="xs:string"/>
<xs:attribute name="bit" use="required" type="integerWithHex"/>
</xs:complexType>
<xs:element name="cli">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="group"/>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="command"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="defaultAccess">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="access" type="access"/>
</xs:sequence>
<xs:attribute name="type" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="operation">
<xs:complexType>
<xs:attribute name="type" type="xs:string"/>
<xs:attribute name="description" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="modifier">
<xs:complexType>
<xs:attribute name="type" type="xs:string"/>
<xs:attribute name="description" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="role">
<xs:complexType>
<xs:attribute name="type" type="xs:string"/>
<xs:attribute name="description" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="privilege" substitutionGroup="role"/>
<xs:element name="accessControl">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="operation"/>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="modifier"/>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="role"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="group">
<xs:complexType>
<xs:sequence>
<xs:element ref="description"/>
</xs:sequence>
<xs:attribute name="id" use="required" type="uIntegerWithHex"/>
<xs:attribute name="name" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="zap" substitutionGroup="configurator"/>
<xs:element name="configurator">
<xs:complexType>
<xs:sequence>
<xs:choice>
<xs:element ref="callback"/>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="deviceType"/>
</xs:choice>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="atomic"/>
<xs:element ref="bitmap"/>
<xs:element ref="cluster"/>
<xs:element ref="clusterExtension"/>
<xs:element ref="enum"/>
<xs:element ref="struct"/>
<xs:element ref="domain"/>
<xs:element ref="global"/>
<xs:element ref="tag"/>
<xs:element ref="accessControl"/>
<xs:element ref="defaultAccess"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
<xs:unique name="structNameKey">
<xs:selector xpath="./struct|enum" />
<xs:field xpath="@name" />
</xs:unique>
</xs:element>
<xs:element name="deviceType">
<xs:complexType>
<xs:sequence>
<xs:element ref="name"/>
<xs:element ref="domain"/>
<xs:element ref="typeName"/>
<xs:element ref="profileId"/>
<xs:element ref="deviceId"/>
<xs:element minOccurs="0" ref="channels"/>
<xs:element ref="clusters"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="typeName" type="xs:string"/>
<xs:element name="profileId">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="editable" use="required" type="xs:boolean"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="deviceId">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="editable" use="required" type="xs:boolean"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="channels">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="channel"/>
</xs:sequence>
<xs:attribute name="editable" use="required" type="xs:boolean"/>
</xs:complexType>
</xs:element>
<xs:element name="channel">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="11"/>
<xs:maxInclusive value="26"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="clusters">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="include"/>
</xs:sequence>
<xs:attribute name="lockOthers" use="required" type="xs:boolean"/>
</xs:complexType>
</xs:element>
<xs:element name="include">
<xs:complexType mixed="true">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="requireAttribute"/>
<xs:element ref="requireCommand"/>
</xs:choice>
<xs:attribute name="client" use="required" type="xs:boolean"/>
<xs:attribute name="clientLocked" use="required" type="xs:boolean"/>
<xs:attribute name="cluster"/>
<xs:attribute name="server" use="required" type="xs:boolean"/>
<xs:attribute name="serverLocked" use="required" type="xs:boolean"/>
</xs:complexType>
</xs:element>
<xs:element name="requireAttribute" type="zclAttributeDefine"/>
<xs:element name="requireCommand" type="zclCommandName"/>
<xs:element name="global">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="command"/>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="attribute"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="atomic">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="type"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="UniqueTypeId">
<xs:selector xpath="type"/>
<xs:field xpath="@id"/>
</xs:unique>
</xs:element>
<xs:element name="type">
<xs:complexType>
<xs:attribute name="id" use="required" type="uIntegerWithHex"/>
<xs:attribute name="name" use="required" type="xs:string"/>
<xs:attribute name="description" use="required" type="xs:string"/>
<xs:attribute name="size" type="integerWithHex"/>
<xs:attribute name="discrete" type="xs:boolean"/>
<xs:attribute name="signed" type="xs:boolean"/>
<xs:attribute name="string" type="xs:boolean"/>
<xs:attribute name="char" type="xs:boolean"/>
<xs:attribute name="long" type="xs:boolean"/>
<xs:attribute name="analog" type="xs:boolean"/>
<xs:attribute name="composite" type="xs:boolean"/>
</xs:complexType>
</xs:element>
<xs:element name="bitmap">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="cluster">
<xs:complexType>
<xs:attribute name="code" type="integerWithHex"/>
</xs:complexType>
</xs:element>
<xs:element maxOccurs="unbounded" ref="field"/>
</xs:sequence>
<xs:attribute name="name" use="required" type="xs:string"/>
<xs:attribute name="type" use="required" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="field">
<xs:complexType>
<xs:attribute name="mask" use="required" type="xs:string"/>
<xs:attribute name="name" use="required" type="xs:string"/>
<xs:attribute name="introducedIn" type="zclSpecVersion"/>
<xs:attribute name="fieldId" type="integerWithHex"/>
</xs:complexType>
</xs:element>
<xs:element name="globalAttribute">
<xs:complexType mixed="true">
<xs:choice>
<xs:element minOccurs="0" maxOccurs="unbounded" name="featureBit" type="featureBit"/>
</xs:choice>
<xs:attribute name="side" use="required" type="zclSideWithEither"/>
<xs:attribute name="code" use="required" type="xs:string"/>
<xs:attribute name="value" use="required" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="optionalConform">
<xs:complexType>
<xs:attribute name="choice" type="xs:string"/>
<xs:attribute name="more" type="xs:boolean"/>
<xs:attribute name="min" type="integerWithHex"/>
</xs:complexType>
</xs:element>
<xs:element name="cluster">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element ref="name"/>
<xs:element ref="domain"/>
<xs:element ref="description"/>
<xs:element ref="code"/>
<xs:element ref="define"/>
<xs:element ref="client"/>
<xs:element ref="server"/>
<xs:element minOccurs="0" ref="generateCmdHandlers"/>
<xs:element minOccurs="0" maxOccurs="unbounded" name="tag" type="tag"/>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="globalAttribute"/>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="attribute"/>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="command"/>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="event"/>
<xs:element minOccurs="0" name="features">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="feature">
<xs:complexType>
<xs:choice>
<xs:element ref="optionalConform"/>
</xs:choice>
<xs:attribute name="bit" use="required" type="integerWithHex" />
<xs:attribute name="code" use="required" type="xs:string" />
<xs:attribute name="name" type="xs:string" />
<xs:attribute name="summary" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
<xs:attribute name="introducedIn" type="xs:string"/>
<xs:attribute name="manufacturerCode" type="zclCode"/>
<xs:attribute name="singleton" type="xs:boolean"/>
<xs:attribute name="apiMaturity" type="zclApiMaturity" />
</xs:complexType>
</xs:element>
<xs:element name="code" type="zclCode"/>
<xs:element name="define" type="xs:string"/>
<xs:element name="client">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:boolean">
<xs:attribute name="init" use="required" type="xs:boolean"/>
<xs:attribute name="tick" use="required" type="xs:boolean"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="server">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:boolean">
<xs:attribute name="init" use="required" type="xs:boolean"/>
<xs:attribute name="tick" use="required" type="xs:boolean"/>
<xs:attribute name="tickFrequency" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="generateCmdHandlers" type="xs:boolean"/>
<xs:element name="clusterExtension">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="attribute"/>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="command"/>
</xs:sequence>
<xs:attribute name="code" use="required" type="xs:string"/>
<xs:attribute name="introducedIn" type="zclSpecVersion"/>
</xs:complexType>
</xs:element>
<xs:element name="enum">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="cluster" type="clusterRef"/>
<xs:element maxOccurs="unbounded" name="item" type="item"/>
</xs:sequence>
<xs:attribute name="description"/>
<xs:attribute name="name" use="required" type="xs:string"/>
<xs:attribute name="type" use="required" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="struct">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="cluster" type="clusterRef"/>
<xs:element minOccurs="0" maxOccurs="unbounded" name="item" type="item"/>
</xs:sequence>
<xs:attribute name="length" type="integerWithHex"/>
<xs:attribute name="name" use="required" type="xs:string"/>
<xs:attribute name="apiMaturity" type="zclApiMaturity" />
</xs:complexType>
</xs:element>
<xs:element name="callback">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="function"/>
</xs:sequence>
<xs:attribute name="postfix" type="xs:string"/>
<xs:attribute name="prefix" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="function">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" ref="description"/>
<xs:element minOccurs="0" maxOccurs="unbounded" name="arg" type="arg"/>
<xs:element minOccurs="0" ref="codeForStub"/>
</xs:sequence>
<xs:attribute name="category" type="xs:string"/>
<xs:attribute name="cluster"/>
<xs:attribute name="consumed" type="xs:boolean"/>
<xs:attribute name="id" use="required" type="uIntegerWithHex"/>
<xs:attribute name="name" use="required"/>
<xs:attribute name="platformType" type="xs:string"/>
<xs:attribute name="returnType" use="required" type="xs:string"/>
<xs:attribute name="side" type="zclSide"/>
<xs:attribute name="stackMacro"/>
</xs:complexType>
</xs:element>
<xs:element name="codeForStub" type="xs:string"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="tag" type="tag"/>
<xs:element name="domain">
<xs:complexType>
<!-- TODO: Remove the string extension once all XML files properly use
name attribute instead of putting the name in the content -->
<xs:complexContent>
<xs:extension base="xs:string" >
<xs:sequence>
<xs:element minOccurs="0" ref="older"/>
</xs:sequence>
<xs:attribute name="dependsOn" type="zclSpecVersion"/>
<xs:attribute name="name" type="xs:string" />
<xs:attribute name="spec" type="zclSpecVersion"/>
<xs:attribute name="certifiable" type="xs:boolean"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="older">
<xs:complexType>
<xs:attribute name="dependsOn" type="xs:string"/>
<xs:attribute name="spec" use="required" type="xs:string"/>
<xs:attribute name="certifiable" type="xs:boolean"/>
</xs:complexType>
</xs:element>
<xs:element name="event">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element ref="description" />
<xs:element minOccurs="0" maxOccurs="unbounded" name="access" type="access"/>
<xs:element minOccurs="0" maxOccurs="unbounded" name="field" type="eventField"/>
</xs:choice>
<xs:attribute name="code" type="xs:string"/>
<xs:attribute name="name" type="xs:string"/>
<xs:attribute name="side" use="required" type="zclSide"/>
<xs:attribute name="priority" type="xs:string"/>
<xs:attribute name="optional" type="xs:boolean" default="false"/>
</xs:complexType>
</xs:element>
<xs:element name="command">
<xs:complexType>
<xs:sequence>
<xs:element ref="description"/>
<xs:element minOccurs="0" maxOccurs="unbounded" name="access" type="access"/>
<xs:element minOccurs="0" maxOccurs="unbounded" name="arg" type="arg"/>
</xs:sequence>
<xs:attribute name="cli"/>
<xs:attribute name="cliFunctionName" type="xs:string"/>
<xs:attribute name="code" type="xs:string"/>
<xs:attribute name="disableDefaultResponse" type="xs:boolean"/>
<xs:attribute name="functionName" type="xs:string"/>
<xs:attribute name="group" type="xs:string"/>
<xs:attribute name="introducedIn" type="zclSpecVersion"/>
<xs:attribute name="noDefaultImplementation" type="xs:boolean"/>
<xs:attribute name="manufacturerCode" type="xs:string"/>
<xs:attribute name="name" type="xs:string"/>
<xs:attribute name="optional" type="xs:boolean"/>
<xs:attribute name="source" type="xs:string"/>
<xs:attribute name="restriction" type="xs:string"/>
<xs:attribute name="response" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="attribute">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="description"/>
<xs:element minOccurs="0" maxOccurs="unbounded" name="access" type="access"/>
</xs:sequence>
<xs:attribute name="code" use="required" type="zclCode"/>
<xs:attribute name="default"/>
<xs:attribute name="define" use="required" type="zclAttributeDefine"/>
<xs:attribute name="introducedIn" type="zclSpecVersion"/>
<xs:attribute name="length" type="integerWithHex"/>
<xs:attribute name="manufacturerCode" type="zclCode"/>
<xs:attribute name="max" type="xs:anySimpleType"/>
<xs:attribute name="min" type="xs:anySimpleType"/>
<xs:attribute name="reportMaxInterval" type="xs:anySimpleType"/>
<xs:attribute name="reportMinInterval" type="xs:anySimpleType"/>
<xs:attribute name="reportableChange" type="xs:anySimpleType"/>
<xs:attribute name="optional" type="xs:boolean" default="false"/>
<xs:attribute name="side" use="required" type="zclSide"/>
<xs:attribute name="type" use="required" type="xs:string"/>
<xs:attribute name="readable" type="xs:boolean"/>
<xs:attribute name="writable" type="xs:boolean"/>
<xs:attribute name="reportable" type="xs:boolean"/>
<xs:attribute name="array" type="xs:boolean"/>
<xs:attribute name="isNullable" type="xs:boolean"/>
<xs:attribute name="entryType" type="xs:string" />
</xs:complexType>
</xs:element>
<xs:element name="description">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="arg" type="arg"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleType name="zclAttributeDefine">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="zclCommandName">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="zclSpecVersion">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="zclCode">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="zclSide">
<xs:restriction base="xs:string">
<xs:enumeration value="client"/>
<xs:enumeration value="server"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="zclSideWithEither">
<xs:restriction base="xs:string">
<xs:enumeration value="client"/>
<xs:enumeration value="server"/>
<xs:enumeration value="either"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="zclApiMaturity">
<xs:restriction base="xs:string">
<xs:enumeration value="stable"/>
<xs:enumeration value="provisional"/>
<xs:enumeration value="internal"/>
<xs:enumeration value="deprecated"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="mapping">
<xs:complexType>
<xs:attribute name="code" type="xs:string"/>
<xs:attribute name="translation" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="map">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="mapping"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>