Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
languagexml
titlePhidgetServo Thing Model
linenumberstrue
<ThingModel#
ThingModel(Name=: "PhidgetServoModel", Combines=: "PhidgetServoFacet">
	<Sid Name=):
    Sid(Name: "PhidServoId"/>
	<String Name=)
    String(Name: "InstalledAtZone"/>
</ThingModel>
<ThingFacet Name="PhidgetServoFacet">
	<String Name="ServoProtocolURL" Default=)
    
ThingFacet(Name: "PhidgetServoFacet"):
    String(Name: "ServoProtocolURL", Default: "phid://"/>
	<String Name=)
    String(Name: "DeviceInterfaceIndex"/>
	<String Name=)
    String(Name: "PhidgetDeviceType"/>
	<Integer Name=)
    Integer(Name: "ServoAngle", KnownBy=: "PhidgetServoAction"/>
	<Action Name=)
    Action(Name: "PhidgetServoAction", Documentation=: "Control servo motor">
		):
      #...
	</Action>
</ThingFacet>

This pattern allows the ThingFacet to be a reusable artifact, and potentially combined by multiple ThingModels.

...

Code Block
languagexml
titlePhidgetServo Thing Model Part of a Zone
linenumberstrue
<ThingFacet name=#
ThingFacet(Name: "EskyPreset">):
  <String name=String(Name: "State", KnownBy=: "SyncPreset"/>)
  <String name=String(Name: "Preset", KnownBy=: "SyncPreset"/>)
  <Action name=Action(Name: "SyncPreset", documentation=: "Synchronize camera state and preset">):
    <WorkflowWorkflow Limit=: "1", Live=: "1", Timeout=: "PT20S">):
      <Task name=Task(Name: "Main", while=: "true">):
        <Event name=Event(Name: "Argument", as=: "ActionArgument"/>)
          #...

     </Task>
    </Workflow>
  </Action>
</ThingFacet>

<ThingFacet name=ThingFacet(Name: "EskyImage", combines=: "Login">):
  <String name=String(Name: "State", KnownBy=: "SyncImage"/>)
  <Clob name=Clob(Name: "Image", KnownBy=: "SyncImage"/>)
  
<!-- Actions -->#Actions
  <Action name=Action(Name: "SyncImage", documentation=: "Synchronize camera state and snapshot image">):
    <WorkflowWorkflow Limit=: "1", Live=: "1", Timeout=: "PT10S">):
      <Task name=Task(Name: "Main", while=: "true">):
        <Event name=Event(Name: "Argument", as=: "ActionArgument"/>)

       ...
      </Task>
    </Workflow>
  </Action>
</ThingFacet>

<ThingModel name=ThingModel(Name: "Esky", combines=: "EskyPreset,EskyImage", documentation=: "actual single instance camera model">):
  <Sid name=Sid(Name: "CameraId"/>
</ThingModel>)

In summary

  • ThingModels are normally used to represent and define interactions with external physical things. The specifics of interactions are often modeled via ThingFacet.
  • ThingModels combine one or more ThingFacets. ThingFacets are reusable artifacts. In runtime, only instances of ThingModels are created and persisted (not ThingFacets). 
  • ThingModels can contain application related information that are related to things.

When ThingModels do not have any Actions or combine any ThingFacet ThingFacets they are equivalent to DataModel i.e pure Attributes only.

Examples of CRUD Operation on a ThingModel:

CREATE:

Code Block
languagexml
titleCreate PhidgetServo Thing Model
linenumberstrue
<Create>
    <PhidgetServoModel>
      <ServoProtocolURL>
        phid://
      </ServoProtocolURL>
      <PhidgetDeviceType>
        PhidgetAdvancedServo
      </PhidgetDeviceType>
      <DeviceInterfaceIndex>
        0
      </DeviceInterfaceIndex>
      <ServoAngle>
        110
      </ServoAngle>
    </PhidgetServoModel>
  </Create>

CREATE RESULT:

Code Block
languagexml
titleCreate PhidgetServoModel Result
linenumberstrue
<Create Status="Success">
  <PhidgetServoModel>
    <PhidServoId>KNJN2YRVAAAAUAABA7LIQ4Y6</PhidServoId>
    <ServoProtocolURL Status="Success+Created:1:1457384153653;" Value="phid://"/>
    <DeviceInterfaceIndex Status="Success+Created:1:1457384153653;" Value="0"/>
    <PhidgetDeviceType Status="Success+Created:1:1457384153653;" Value="PhidgetAdvancedServo"/>
    <ServoAngle Status="Success+Created:1:1457384153654;" Value="110"/>
  </PhidgetServoModel>
</Create>

Note: If a ThingModel is combined with a ThingFacet, creation of a ThingModel results in instantiating (Trigger) of a ThingFacet action.

UPDATE:

Code Block
languagexml
titlePhidgetServo Thing Model
linenumberstrue
<Query>
  <Find format="version">
    <PhidgetServoModel as="var.PS">
      <PhidServoId ne=""/>
    </PhidgetServoModel>
  </Find>
  <SetResponseData>
    <key>
      Message.Value.Find.Result.PhidgetServoModel.ServoAngle.Value
    </key>
    <value>
      120
    </value>
  </SetResponseData>
  <Update>
    <from>
      Result
    </from>
    <Include>
      $Response.Message.Value.Find
    </Include>
  </Update>
</Query>

 

UPDATE Result:

Code Block
languagexml
titlePhidgetServo Thing Model
linenumberstrue
<Find Status="Success" Format="version">
  <Result>
    <PhidgetServoModel>
      <PhidServoId>KNJPIFR6AAAAUAABA67ZRBQO</PhidServoId>
      <PhidgetDeviceType Value="PhidgetAdvancedServo" Version="1"/>
      <ServoAngle Version="1" Value="120"/>
      <DeviceInterfaceIndex Value="0" Version="1"/>
      <ServoProtocolURL Value="phid://" Version="1"/>
    </PhidgetServoModel>
  </Result>
</Find>
<Update Status="Success" Format="version">
  <PhidgetServoModel>
    <PhidServoId>KNJPIFR6AAAAUAABA67ZRBQO</PhidServoId>
    <ServoProtocolURL Status="Success_NoAction:1:1457385641534;" Value="phid://" Version="1"/>
    <DeviceInterfaceIndex Status="Success_NoAction:1:1457385641534;" Value="0" Version="1"/>
    <PhidgetDeviceType Status="Success_NoAction:1:1457385641535;" Value="PhidgetAdvancedServo" Version="1"/>
    <ServoAngle Status="Success=Updated:2:1457385767153;" Value="120" Version="2"/>
  </PhidgetServoModel>
</Update>

Note: If a ThingModel is combined with a ThingFacet updating a ThingModel attribute results in Trigger of a Action if that attribute is associated with an action.

DELETE:

Code Block
languagexml
titleDelete PhidgetServoModel Thing Model
linenumberstrue
<<Query>
  <DeleteAll>
    <PhidgetServoModel>
      <PhidServoId ne=""/>
    </PhidgetServoModel>
  </DeleteAll>
</Query>

DELETE Result

Code Block
languagexml
titleDelete PhidgetServoModel Thing Model Result
linenumberstrue
<DeleteAll Status="Success">
  <Result>
    <PhidgetServoModel>
      <PhidServoId>KNJOOOBZAAAAUAABA72MMI6E</PhidServoId>
      <PhidgetDeviceType>PhidgetAdvancedServo</PhidgetDeviceType>
      <ServoAngle>110</ServoAngle>
      <DeviceInterfaceIndex>0</DeviceInterfaceIndex>
      <ServoProtocolURL>phid://</ServoProtocolURL>
    </PhidgetServoModel>
  </Result>
</DeleteAll>

Note: If a ThingModel is combined with a ThingFacet, creation of a ThingModel results in deleting an instance results in cleanup of connections with actual things as per the protocol Handler used.

 

 

FIND

Code Block
languagexml
titlePhidgetServo Thing Model
linenumberstrue
<Query>
  <Find format="all">
    <PhidgetServoModel>
      <PhidServoId ne="" />
    </PhidgetServoModel>
  </Find>
</Query>

 

Find result: Format="all" - returns all the internal attribute data as well.

Code Block
languagexml
titlePhidgetServoModel ThingModel Find Result
linenumberstrue
<Find Status="Success" Format="all">
  <Result>
    <PhidgetServoModel QName="Atomiton.PhidgetServos.PhidgetServoModel">
      <PhidServoId>KNJOOOBZAAAAUAABA72MMI6E</PhidServoId>
      <PhidgetDeviceType Value="PhidgetAdvancedServo" Known="PhidgetAdvancedServo" Version="1" Timestamp="1457384798266" DateTime="2016-03-07 13:06:38.266" QName="Atomiton.PhidgetServos.PhidgetServoModel.PhidgetDeviceType" FName="PhidgetDeviceType"/>
      <ServoAngle Value="110" Known="110" Version="1" Timestamp="1457384798266" DateTime="2016-03-07 13:06:38.266" QName="Atomiton.PhidgetServos.PhidgetServoModel.ServoAngle" FName="ServoAngle"/>
      <DeviceInterfaceIndex Value="0" Known="0" Version="1" Timestamp="1457384798266" DateTime="2016-03-07 13:06:38.266" QName="Atomiton.PhidgetServos.PhidgetServoModel.DeviceInterfaceIndex" FName="DeviceInterfaceIndex"/>
      <ServoProtocolURL Value="phid://" Known="phid://" Version="1" Timestamp="1457384798265" DateTime="2016-03-07 13:06:38.265" QName="Atomiton.PhidgetServos.PhidgetServoModel.ServoProtocolURL" FName="ServoProtocolURL"/>
    </PhidgetServoModel>
  </Result>
</Find>

 

Note:

  1. When ThingModels are do not combine ThingFacet it is equivalent of a DataModel i.e pure Data only.
  2. Although not required, it is best practice to always create a ThingModel with one attribute that is of type SystemId or Sid.

 ThingModel can be created, read, update and deleted using TQL queries.


Expand
titleCRUD operations on ThingModels


Info
iconfalse

Include Page
CRUD on ThingModels
CRUD on ThingModels

Go to page