Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 16 Next »

ThingModel is one kind of Model (the other kinds are DataModels and AppModels). Therefore it has all the properties of Models (Lifecycle of modelsModel AttributesUnique and Constraints).

A ThingModel has

However, as a recommended practice, the Attributes and Actions related to the interactions with an external thing (sensors, actuators, machines) are often defined in a reusable structure called ThingFacet, and combined into a ThingModel. This relationship was explained in the concept of Models and Model Facets. Application related information are often defined directly as attributes of the ThingModel.

In the following example, the ThingModel PhidgetServoModel combines the ThingFacet PhidgetServoFacet, where: 

  • PhidgetServoFacet contains the device interaction specific Attributes (e.g. ServoProtocolURL) and Actions (e.g. PhidgetServoAction);
  • PhidgetServoModel contains application related Attributes: PhidServoId and InstalledAtZone (assuming the Phidget servo motor is installed in a particular zone within a Greenhouse environment, which has multiple zones).
  • Combines is used as a modifier of ThingModel

In the simplest case, a ThingModel may only have one single directly defined attribute of type Sid. Although not required, it is best practice to always create a ThingModel with one attribute that is of type SystemId or Sid.

PhidgetServo Thing Model
<ThingModel Name="PhidgetServoModel" Combines="PhidgetServoFacet">
	<Sid Name="PhidServoId"/>
	<String Name="InstalledAtZone"/>
</ThingModel>
<ThingFacet Name="PhidgetServoFacet">
	<String Name="ServoProtocolURL" Default="phid://"/>
	<String Name="DeviceInterfaceIndex"/>
	<String Name="PhidgetDeviceType"/>
	<Integer Name="ServoAngle" KnownBy="PhidgetServoAction"/>
	<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.

Note: One can combine multiple ThingFacets within a single ThingModel using comma separated list of ThingFacets.

For Example Esky ThingModel combining EskyPreset and EskyImage Thing Facets

PhidgetServo Thing Model Part of a Zone
<ThingFacet name="EskyPreset">
  <String name="State" KnownBy="SyncPreset"/>
  <String name="Preset" KnownBy="SyncPreset"/>
  <Action name="SyncPreset" documentation="Synchronize camera state and preset">
    <Workflow Limit="1" Live="1" Timeout="PT20S">
      <Task name="Main" while="true">
        <Event name="Argument" as="ActionArgument"/>
        ...
      </Task>
    </Workflow>
  </Action>
</ThingFacet>

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

<ThingModel name="Esky" combines="EskyPreset,EskyImage" documentation="actual single instance camera model">
  <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 combine any ThingFacet they are equivalent to DataModel i.e pure Attributes only.

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

 CRUD operations on ThingModels

Examples of CRUD Operation on a ThingModel:

CREATE:

Create PhidgetServo Thing Model
#
Create: 
    PhidgetServoModel: 
      ServoProtocolURL: "phid://"
      PhidgetDeviceType: "PhidgetAdvancedServo"
      DeviceInterfaceIndex: 0
      ServoAngle: 110

CREATE RESULT:

Create PhidgetServoModel Result
#
Create(Status: "Success"):
  PhidgetServoModel: 
    PhidServoId: "KNJN2YRVAAAAUAABA7LIQ4Y6" 
    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")

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


UPDATE:

PhidgetServo Thing Model
#
Query: 
  Find(format: "version"):
    PhidgetServoModel as: "var.PS"):
      PhidServoId(ne: "")
  SetResponseData: 
    key: Message.Value.Find.Result.PhidgetServoModel.ServoAngle.Value
    value: 120
  Update: 
    from: Result
    Include: $Response.Message.Value.Find


UPDATE Result:

PhidgetServo Thing Model
#
Find(Status: "Success", Format: "version"):
  Result: 
    PhidgetServoModel: 
      PhidServoId: "KNJPIFR6AAAAUAABA67ZRBQO" 
      PhidgetDeviceType(Value: "PhidgetAdvancedServo", Version: "1")
      ServoAngle(Version: "1", Value: "120")
      DeviceInterfaceIndex(Value: "0", Version: "1")
      ServoProtocolURL(Value: "phid://", Version: "1")

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:

Delete PhidgetServoModel Thing Model
#
Query: 
  DeleteAll: 
    PhidgetServoModel: 
      PhidServoId(ne: "")


DELETE Result

Delete PhidgetServoModel Thing Model Result
#
DeleteAll(Status: "Success"):
  Result: 
    PhidgetServoModel: 
      PhidServoId: "KNJOOOBZAAAAUAABA72MMI6E"
      PhidgetDeviceType: "PhidgetAdvancedServo"
      ServoAngle: 110
      DeviceInterfaceIndex: 0
      ServoProtocolURL: "phid://"

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

PhidgetServo Thing Model
#
Query: 
  Find(format: "all"):
    PhidgetServoModel:
      PhidServoId(ne: "")


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

PhidgetServoModel ThingModel Find Result
#
Find(Status: "Success", Format: "all"):
  Result: 
    PhidgetServoModel(QName: "Atomiton.PhidgetServos.PhidgetServoModel"):
      PhidServoId: "KNJOOOBZAAAAUAABA72MMI6E" 
      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")


Note:

Go to page

 

 

  • No labels