<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           xmlns:sd="urn:cablelabs:packetcable:sma:xsd:v1:deviceprofile" 
           targetNamespace="urn:cablelabs:packetcable:sma:xsd:v1:deviceprofile">
  <xs:simpleType name="TagType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Lighting"/>
      <xs:enumeration value="Climate"/>
      <xs:enumeration value="Security"/>
      <xs:enumeration value="Surveillance"/>
      <xs:enumeration value="Controller"/>
      <xs:enumeration value="MediaServer"/>
      <xs:enumeration value="HVAC"/>
      <xs:enumeration value="Safety"/>
      <xs:enumeration value="Light"/>
      <xs:enumeration value="Thermostat"/>
      <xs:enumeration value="Window Covering"/>
      <xs:enumeration value="Fan"/>
      <xs:enumeration value="Sensor"/>
      <xs:enumeration value="Actuator"/>
      <xs:enumeration value="Motion Sensor"/>
      <xs:enumeration value="Occupancy Sensor"/>
      <xs:enumeration value="Temperature Sensor"/>
      <xs:enumeration value="Glass Break sensor"/>
      <xs:enumeration value="Door/Window Sensor"/>
      <xs:enumeration value="CO Sensor"/>
      <xs:enumeration value="Heat Sensor"/>
      <xs:enumeration value="Smoke Sensor"/>
      <xs:enumeration value="Flammable Gas sensor"/>
      <xs:enumeration value="Water Sensor"/>
      <xs:enumeration value="Water Level sensor"/>
      <xs:enumeration value="Humidity Sensor"/>
      <xs:enumeration value="Wind Speed Sensor"/>
      <xs:enumeration value="Wind Direction Sensor"/>
      <xs:enumeration value="Rain Sensor"/>
      <xs:enumeration value="Dewpoint Sensor"/>
      <xs:enumeration value="Barometric Pressure Sensor"/>
      <xs:enumeration value="Stress Sensor"/>
      <xs:enumeration value="Door Lock"/>
      <xs:enumeration value="Alarm Panel"/>
      <xs:enumeration value="Keypad"/>
      <xs:enumeration value="Keyfob"/>
      <xs:enumeration value="Panic Pendant"/>
      <xs:enumeration value="Camera"/>
      <xs:enumeration value="Weight Sensor"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="BaseDataTypes">
    <xs:restriction base="xs:string">
      <xs:enumeration value="string"/>
      <xs:enumeration value="integer"/>
      <xs:enumeration value="number"/>
      <xs:enumeration value="boolean"/>
      <xs:enumeration value="double"/>
      <xs:enumeration value="float"/>
      <xs:enumeration value="second"/>
      <xs:enumeration value="meters">
        <xs:annotation>
          <xs:documentation>
                        Length.
                    </xs:documentation>
        </xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="watts">
        <xs:annotation>
          <xs:documentation>
                        Power.
                    </xs:documentation>
        </xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="psi">
        <xs:annotation>
          <xs:documentation>
                        Pressure.
                    </xs:documentation>
        </xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="percent">
        <xs:annotation>
          <xs:documentation>
                        integer, 0-100.
                    </xs:documentation>
        </xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="angularDegrees"/>
      <xs:enumeration value="degreesCPerMinute"/>
    </xs:restriction>
  </xs:simpleType>
  <!--  Some enumeration which could be overridden -->
  <xs:simpleType name="FanModes">
    <xs:restriction base="xs:string">
      <xs:enumeration value="On"/>
      <xs:enumeration value="Off"/>
      <xs:enumeration value="Low"/>
      <xs:enumeration value="Med"/>
      <xs:enumeration value="Hi"/>
      <xs:enumeration value="Auto"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="TemperatureFanModes">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Heat"/>
      <xs:enumeration value="Cool"/>
      <xs:enumeration value="Emergency Heart"/>
      <xs:enumeration value="Off"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="ThermostatModes">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Off"/>
      <xs:enumeration value="Heat"/>
      <xs:enumeration value="Cool"/>
      <xs:enumeration value="Auto"/>
      <xs:enumeration value="EmergencyHeat"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="SecuritySystemModes">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Armed"/>
      <xs:enumeration value="Disarmed"/>
      <xs:enumeration value="StayArmed"/>
      <xs:enumeration value="Alarming"/>
      <xs:enumeration value="Disconnected"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="BatteryStates">
    <xs:restriction base="xs:string">
      <xs:enumeration value="charging"/>
      <xs:enumeration value="depleted"/>
      <xs:enumeration value="fullycharged"/>
      <xs:enumeration value="unknown"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="CommunicationChannelStatus">
    <xs:restriction base="xs:string">
      <xs:enumeration value="connected"/>
      <xs:enumeration value="disconnected"/>
      <xs:enumeration value="generalError"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="TemperatureUnits">
    <xs:restriction base="xs:string">
      <xs:enumeration value="celsius"/>
      <xs:enumeration value="fahrenheit"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="StatusUnits">
    <xs:restriction base="xs:string">
      <xs:enumeration value="On"/>
      <xs:enumeration value="Off"/>
      <xs:enumeration value="Unknown"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="OpeningStates">
    <xs:restriction base="xs:string">
      <xs:enumeration value="open"/>
      <xs:enumeration value="closed"/>
      <xs:enumeration value="partial"/>
      <xs:enumeration value="unknown"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="ButtonStates">
    <xs:restriction base="xs:string">
      <xs:enumeration value="pressed"/>
      <xs:enumeration value="released"/>
      <xs:enumeration value="held"/>
      <xs:enumeration value="doubleTapped"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="SpeedUnits">
    <xs:restriction base="xs:string">
      <xs:enumeration value="mph"/>
      <xs:enumeration value="kmph"/>
      <xs:enumeration value="fps"/>
      <xs:enumeration value="mps"/>
      <xs:enumeration value="knots"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="OpenCloseModes">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Closed"/>
      <xs:enumeration value="Opened"/>
      <xs:enumeration value="Partial"/>
      <xs:enumeration value="Unknown"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="enumUnits">
    <xs:union memberTypes="sd:BaseDataTypes sd:FanModes sd:TemperatureFanModes sd:FanModes sd:TemperatureFanModes sd:ThermostatModes sd:SecuritySystemModes sd:SecuritySystemModes sd:BatteryStates sd:CommunicationChannelStatus sd:TemperatureUnits sd:StatusUnits sd:OpeningStates sd:ButtonStates sd:SpeedUnits sd:OpenCloseModes"/>
  </xs:simpleType>
  <!-- Properties -->
  <xs:complexType name="Property">
    <xs:attribute name="read" type="xs:boolean" use="required"/>
    <xs:attribute name="write" type="xs:boolean" use="required"/>
    <xs:attribute name="unit" type="sd:enumUnits" use="optional"/>
    <xs:attribute name="min" type="xs:double" use="optional"/>
    <xs:attribute name="max" type="xs:double" use="optional"/>
  </xs:complexType>
  <!--  Signaling -->
  <xs:complexType name="PropertyValuePair">
    <xs:attribute name="id" type="xs:string" use="required"/>
    <xs:attribute name="value" type="xs:string" use="required"/>
  </xs:complexType>
  <!-- Sensing Properties -->
  <xs:complexType name="BinaryInputSensorProperty">
    <xs:complexContent>
      <xs:restriction base="sd:Property">
        <xs:attribute name="read" type="xs:boolean" use="required" fixed="true"/>
        <xs:attribute name="write" type="xs:boolean" use="required" fixed="false"/>
        <xs:attribute name="unit" type="sd:enumUnits" fixed="boolean"/>
        <xs:attribute name="min" use="prohibited"/>
        <xs:attribute name="max" use="prohibited"/>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="AnalogInputSensorProperty">
    <xs:complexContent>
      <xs:restriction base="sd:Property">
        <xs:attribute name="read" type="xs:boolean" use="required" fixed="true"/>
        <xs:attribute name="write" type="xs:boolean" use="required" fixed="false"/>
        <xs:attribute name="unit" type="sd:enumUnits" fixed="double"/>
        <xs:attribute name="min" type="xs:double" use="required"/>
        <xs:attribute name="max" type="xs:double" use="required"/>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="TemperatureSensorProperty">
    <xs:complexContent>
      <xs:restriction base="sd:Property">
        <xs:attribute name="read" type="xs:boolean" use="required" fixed="true"/>
        <xs:attribute name="write" type="xs:boolean" use="required" fixed="false"/>
        <xs:attribute name="unit" type="sd:TemperatureUnits" default="fahrenheit"/>
        <xs:attribute name="min" type="xs:double" use="required"/>
        <xs:attribute name="max" type="xs:double" use="required"/>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>
  <!--  Status Properties -->
  <xs:complexType name="Stat">
    <xs:annotation>
      <xs:documentation>
          Three potential values:
          On, Off, Unknown
          </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:restriction base="sd:Property">
        <xs:attribute name="read" type="xs:boolean" use="required" fixed="true"/>
        <xs:attribute name="write" type="xs:boolean" use="required" fixed="false"/>
        <xs:attribute name="unit" type="sd:StatusUnits" default="Unknown"/>
        <xs:attribute name="min" type="xs:double" use="prohibited"/>
        <xs:attribute name="max" type="xs:double" use="prohibited"/>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="OnlevelProperty">
    <xs:annotation>
      <xs:documentation>
            Onlevel also includes On/off this way, we do not have to
            have multiple instantiations of the same class
          </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
      <xs:restriction base="sd:Property">
        <xs:attribute name="read" type="xs:boolean" use="required" fixed="true"/>
        <xs:attribute name="write" type="xs:boolean" use="required" fixed="true"/>
        <xs:attribute name="unit" type="sd:BaseDataTypes" fixed="percent"/>
        <xs:attribute name="min" type="xs:double" use="optional" default="0"/>
        <xs:attribute name="max" type="xs:double" use="optional" default="100"/>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="RampRateProperty">
    <xs:complexContent>
      <xs:restriction base="sd:Property">
        <xs:attribute name="read" type="xs:boolean" use="required" fixed="true"/>
        <xs:attribute name="unit" type="sd:BaseDataTypes" fixed="second"/>
        <xs:attribute name="min" type="xs:double" use="optional" default="0"/>
        <xs:attribute name="max" type="xs:double" use="optional" default="60"/>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="FanModeProperty">
    <xs:complexContent>
      <xs:restriction base="sd:Property">
        <xs:attribute name="read" type="xs:boolean" use="required" fixed="true"/>
        <xs:attribute name="write" type="xs:boolean" use="required" fixed="true"/>
        <xs:attribute name="unit" type="sd:FanModes" default="Auto"/>
        <xs:attribute name="min" type="xs:double" use="prohibited"/>
        <xs:attribute name="max" type="xs:double" use="prohibited"/>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="TemperatureModeProperty">
    <xs:complexContent>
      <xs:restriction base="sd:Property">
        <xs:attribute name="read" type="xs:boolean" use="required" fixed="true"/>
        <xs:attribute name="write" type="xs:boolean" use="required" fixed="true"/>
        <xs:attribute name="unit" type="sd:TemperatureFanModes" default="Off"/>
        <xs:attribute name="min" type="xs:double" use="prohibited"/>
        <xs:attribute name="max" type="xs:double" use="prohibited"/>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ThermostatModeProperty">
    <xs:complexContent>
      <xs:restriction base="sd:Property">
        <xs:attribute name="read" type="xs:boolean" use="required" fixed="false"/>
        <xs:attribute name="unit" type="sd:ThermostatModes" default="Auto"/>
        <xs:attribute name="min" type="xs:double" use="prohibited"/>
        <xs:attribute name="max" type="xs:double" use="prohibited"/>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="SetpointProperty">
    <xs:complexContent>
      <xs:restriction base="sd:Property">
        <xs:attribute name="read" type="xs:boolean" use="required" fixed="false"/>
        <xs:attribute name="unit" type="sd:TemperatureUnits" default="fahrenheit"/>
        <xs:attribute name="min" type="xs:double" use="optional" default="0"/>
        <xs:attribute name="max" type="xs:double" use="optional" default="114"/>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>
  <!--  Methods -->
  <!--  Methods return HTTP responses (provisional/standard) -->
  <xs:complexType name="Method"/>
  <xs:complexType name="DimmerPresetMethod">
    <xs:complexContent>
      <xs:extension base="sd:Method">
        <xs:sequence>
		<xs:element name="brightness" type="sd:BaseDataTypes" 
                                              fixed="percent" minOccurs="0"/>
	  <xs:element name="ramprate" type="sd:BaseDataTypes"               
                                      fixed="percent" minOccurs="0"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <!--  Interfaces -->
  <xs:complexType name="Interface" abstract="true">
    <xs:annotation>
      <xs:documentation>
                Defines abstract device functionalities
                All other device profiles shall inherit from Interface
                *note: functionalities and not properties
            </xs:documentation>
    </xs:annotation>
    <xs:attribute name="name" type="xs:string" use="optional"/>
  </xs:complexType>
  <xs:complexType name="PowerInterface">
    <xs:complexContent>
      <xs:extension base="sd:Interface">
        <xs:sequence>
          <xs:element name="turnOn" type="sd:Method"/>
          <xs:element name="turnOff" type="sd:Method"/>
          <xs:element name="status" type="sd:Stat" minOccurs="0"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="BinaryInterface">
    <xs:complexContent>
      <xs:extension base="sd:Interface">
        <xs:sequence>
          <xs:element name="state" type="sd:BinaryInputSensorProperty"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="AnalogInterface">
    <xs:complexContent>
      <xs:extension base="sd:Interface">
        <xs:sequence>
          <xs:element name="state" type="sd:AnalogInputSensorProperty"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="AnalogPercentInterface">
    <xs:complexContent>
      <xs:extension base="sd:Interface">
        <xs:sequence>
          <xs:element name="state" type="sd:BaseDataTypes" fixed="percent"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="DimmableInterface">
    <xs:complexContent>
      <xs:extension base="sd:Interface">
        <xs:sequence>
          <xs:element name="turnOnTo" type="sd:DimmerPresetMethod"/>
          <xs:element name="turnOffTo" type="sd:DimmerPresetMethod"/>
          <xs:element name="dim" type="sd:DimmerPresetMethod" minOccurs="0"/>
          <xs:element name="brighten" type="sd:DimmerPresetMethod" minOccurs="0"/>
          <xs:element name="brightnessLevel" type="sd:OnlevelProperty" minOccurs="0"/>
          <xs:element name="brightnessPreset" type="sd:OnlevelProperty" minOccurs="0"/>
          <xs:element name="rampRatePreset" type="sd:RampRateProperty" minOccurs="0"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="TempCtrlInterface">
    <xs:complexContent>
      <xs:extension base="sd:Interface">
        <xs:sequence>
          <xs:element name="currentSetpoint" type="sd:SetpointProperty"/>
          <xs:element name="heatSetpoint" type="sd:SetpointProperty" minOccurs="0"/>
          <xs:element name="coolSetpoint" type="sd:SetpointProperty" minOccurs="0"/>
          <xs:element name="incrementSetpoint" type="sd:Method" minOccurs="0"/>
          <xs:element name="decrementSetpoint" type="sd:Method" minOccurs="0"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ClimateControlInterface">
    <xs:complexContent>
      <xs:extension base="sd:Interface">
        <xs:sequence>
          <xs:element name="fanMode" type="sd:FanModeProperty"/>
          <xs:element name="fanStatus" type="sd:Stat" minOccurs="0"/>
          <xs:element name="temperatureMode" type="sd:FanModeProperty" minOccurs="0"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="TemperatureInputInterface">
    <xs:complexContent>
      <xs:extension base="sd:Interface">
        <xs:sequence>
          <xs:element name="temperature" type="sd:TemperatureSensorProperty"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ThermostatInterface">
    <xs:complexContent>
      <xs:extension base="sd:Interface">
        <xs:sequence>
          <xs:element name="temperature" type="sd:TemperatureSensorProperty"/>
          <xs:element name="currentSetpoint" type="sd:SetpointProperty"/>
          <xs:element name="coolSetpoint" type="sd:SetpointProperty" minOccurs="0"/>
          <xs:element name="heatSetpoint" type="sd:SetpointProperty" minOccurs="0"/>
          <xs:element name="fanMode" type="sd:FanModeProperty" minOccurs="0"/>
	  <xs:element name="thermostatMode" type="sd:ThermostatModeProperty" 
                                            minOccurs="0"/>
          <xs:element name="incrementSetpoint" type="sd:Method"/>
          <xs:element name="decrementSetpoint" type="sd:Method"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="PanInterface">
    <xs:complexContent>
      <xs:extension base="sd:Interface">
        <xs:sequence>
          <xs:element name="panRight" type="sd:Method"/>
          <xs:element name="panLeft" type="sd:Method"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="TiltInterface">
    <xs:complexContent>
      <xs:extension base="sd:Interface">
        <xs:sequence>
          <xs:element name="tiltUp" type="sd:Method"/>
          <xs:element name="tiltDown" type="sd:Method"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ZoomInterface">
    <xs:complexContent>
      <xs:extension base="sd:Interface">
        <xs:sequence>
          <xs:element name="zoomIn" type="sd:Method"/>
          <xs:element name="zoomOut" type="sd:Method"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="CameraPresetInterface">
    <xs:complexContent>
      <xs:extension base="sd:Interface">
        <xs:sequence>
          <xs:element name="name" type="sd:BaseDataTypes" fixed="string"/>
          <xs:element name="index" type="sd:BaseDataTypes" fixed="integer"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="MediaInterface">
    <xs:complexContent>
      <xs:extension base="sd:Interface">
        <xs:sequence>
          <xs:element name="getMedia" type="sd:Method"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="CoveringInterface">
    <xs:complexContent>
      <xs:extension base="sd:Interface">
        <xs:sequence>
          <xs:element name="open"  type="sd:Method"/>
          <xs:element name="close" type="sd:Method"/>
	  <xs:element name="level" type="sd:BaseDataTypes" 
                                   fixed="percent" minOccurs="0">
            <xs:annotation>
              <xs:documentation>
              This indicates the percent open, i.e.,
                0   = "Fully Closed"
                100 = "Fully Open"
              </xs:documentation>
            </xs:annotation>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="angleOfRotationInterface">
    <xs:complexContent>
      <xs:extension base="sd:Interface">
        <xs:sequence>
          <xs:element name="angle" type="sd:BaseDataTypes" fixed="angularDegrees"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="batteryInterface">
    <xs:complexContent>
      <xs:extension base="sd:Interface">
        <xs:sequence>
          <xs:element name="batteryState" type="sd:BatteryStates"/>
	  <xs:element name="powerLevel" type="sd:BaseDataTypes" 
                      fixed="percent" minOccurs="0"/>
	  <xs:element name="powerVoltage" type="sd:BaseDataTypes" 
                      fixed="float" minOccurs="0"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="DeviceOnBatteryInterface">
    <xs:complexContent>
      <xs:extension base="sd:Interface">
        <xs:sequence>
          <xs:element name="runningOnBattery" type="sd:BaseDataTypes" fixed="boolean"/>
          <!-- Is this required? -->
          <xs:element name="runningOnPrimary" type="sd:BaseDataTypes" fixed="boolean"/>
          <xs:element name="runOnBattery" type="sd:Method" minOccurs="0"/>
          <xs:element name="runOnPrimary" type="sd:Method" minOccurs="0"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="RainSensorInterface">
    <xs:complexContent>
      <xs:extension base="sd:Interface">
        <xs:sequence>
          <xs:element name="state" type="sd:AnalogInterface"/>
          <xs:element name="reset" type="sd:Method" minOccurs="0"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="DirectionInterface">
    <xs:complexContent>
      <xs:extension base="sd:Interface">
        <xs:choice>
          <xs:element name="azimuthAngle" type="sd:BaseDataTypes" fixed="angularDegrees"/>
          <xs:element name="azimuthString" type="sd:BaseDataTypes" fixed="string"/>
        </xs:choice>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="SpeedInterface">
    <xs:complexContent>
      <xs:extension base="sd:Interface">
        <xs:sequence>
          <xs:element name="value" type="sd:BaseDataTypes" fixed="float"/>
          <xs:element name="units" type="sd:SpeedUnits" default="mph"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="PressureInterface">
    <xs:complexContent>
      <xs:extension base="sd:Interface">
        <xs:sequence>
          <xs:element name="value" type="sd:BaseDataTypes" fixed="float"/>
          <!-- Do we need an enumeration? -->
          <xs:element name="units" type="sd:BaseDataTypes" fixed="string"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ButtonInterface">
    <xs:complexContent>
      <xs:extension base="sd:Interface">
        <xs:sequence>
          <xs:element name="id" type="sd:BaseDataTypes" fixed="string"/>
          <xs:element name="state" type="sd:ButtonStates"/>
          <xs:element name="press" type="sd:Method" minOccurs="0"/>
          <xs:element name="release" type="sd:Method" minOccurs="0"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="AlarmPanelInterface">
    <xs:complexContent>
      <xs:extension base="sd:Interface">
        <xs:sequence>
          <xs:element name="state" type="sd:SecuritySystemModes"/>
          <xs:element name="ready" type="sd:BaseDataTypes" fixed="boolean"/>
	  <xs:element name="lastStateChange" type="sd:BaseDataTypes" fixed="string" 
                      minOccurs="0"/>
          <xs:element name="lastZoneTriggered" type="sd:BaseDataTypes" fixed="string" 
                      minOccurs="0"/>
          <xs:element name="lastMethod" type="sd:BaseDataTypes" fixed="string" 
                      minOccurs="0"/>
          <xs:element name="lastMethodStatus" type="sd:BaseDataTypes" 
                      fixed="string" minOccurs="0"/>
          <xs:element name="arm" type="sd:Method" minOccurs="0"/>
          <xs:element name="disarm" type="sd:Method" minOccurs="0"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="CommunicationChannelInterface">
    <xs:complexContent>
      <xs:extension base="sd:Interface">
        <xs:sequence>
          <xs:element name="state" type="sd:CommunicationChannelStatus"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="Device">
    <xs:sequence>
      <xs:element name="interface" type="sd:Interface" minOccurs="0" 
                      maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="name" type="sd:TagType" use="optional"/>
    <xs:attribute name="manufacturer" type="xs:string" use="required"/>
    <xs:attribute name="model" type="xs:string" use="required"/>
    <xs:attribute name="swversion" type="xs:string" use="required"/>
    <xs:attribute name="hwversion" type="xs:string" use="optional"/>
    <!-- This provides the minor version of this device profile; use '0' for this version -->
    <xs:attribute name="deviceProfileMinorVersion" type="xs:integer" use="required"/>
  </xs:complexType>
  
</xs:schema>
