6.9 KiB
SDK - The Data Model
Introduction
The OpenMTC data model represents the resources of the M2M resource tree(s) through classes and objects. All model classes derive from the base class openmtc.model.Entity
. An Entity represents a data type defined in the respective Instances of these classes and have all the attributes of the respective type. Also, the constructors of these classes accept all relevant attributes. Attributes that are missing on construction will be initialized with default values (mostly None
or empty lists).
Entities vs. Resources
As mentioned above, entity classes are the base class for all model entities. A special case of an entity is a resource. Resources are "first class" objects that are represented directly in the resource tree, e.g. the OneM2M AE
(Application Entity) resource.
Different Data Models
At present, OpenMTC uses two different data models:
- The OneM2M data model
- OpenMTC's internal data model (The "unified" data model)
OpenMTC uses the unified data model for storing data in a database. Objects are mapped to / from this model to an externally visible model as needed. The reason for this is that certain resources should be visible through multiple representations. E.g. an OneM2M AE
resource will be mapped internally as a UnifiedApplication
resource.
Note: This mapping of models happens mostly transparent at database adapter level. The actual mapping is performed by the openmtc_unified
module. Code that is specific to a certain M2M standard does not need to have knowledge about the unified data model. This means that for example the OneM2M controller classes will always only have to work with OneM2M resource types, even though those are mapped to unified types when stored in the database.
Member Variables
Member variables on OpenMTC model objects are of three different varieties:
- attributes - Any attributes that are directly contained within an object. Examples include
App_Id
andappName
. Upon initializing/assigning attributes, type checking and possibly conversion is performed. Illegal values will be rejected by raising an appropriateException
. Attributes can be of the following types:- strings (Python type
str
). By default initialized withNone
. - integers (Python type
int
). By default initialized withNone
. - floating point (Python type
float
). By default initialized withNone
. - dates (Python type
datetime.datetime
). By default initialized withNone
. - sequences (Python type
list
). By default initialized with an emptylist
([]
). - complex objects (Python type
dict
). By default intialized with an emptydict
({}
). These are used to represent objects that are not themsekves adressable within the resource tree, e.g. permission objects. - resources - The
latest
andoldest
members ofContentInstances
objects are represented as attributes. By default initialized withNone
.
- strings (Python type
- collections - Any variable length collection of child resources held by an object. By default initialized with an empty collection.
- subresources - All other children of a resource instance. By default initialized with a default-initialized object.
Common Properties
The following properties exist on instances of model classes:
path
- The path of the object. e.g."/onem2m/TestGIP/devices/temp02"
parent_path
(read-only) - The path of this resource's parent resource. This is derived from the resource's path. e.g. for a resource withpath="/onem2m/TestGIP/devices/temp02"
theparent_path
would be"/onem2m/TestGIP/devices"
name
(read-only) - the last element of the resource's path. e.g. for a resource withpath="/onem2m/TestGIP/devices/temp02"
thename
would be"temp02"
Introspection
The members of each OneM2M resource class can be inspected at run-time. For this matter, each resource class has the attributes
property, which returns a list of all attribute members.
Creating Objects
To create an object representing a resource from the OneM2M resource tree, one simply invokes its constructor. All classes can be instantiated without arguments. The following example creates an AE
object that represents an OneM2M Application Entity resource.
This file can be found here.
# Example 1: Creating Objects
from openmtc_onem2m.model import AE
my_app = AE()
print my_app.path
#>>> None
print my_app.App_ID
#>>> None
print my_app.parent_path
#>>> None
print my_app.labels
#>>> None
print my_app.attributes
#>>> [UnicodeAttribute(name="AE-ID", type=unicode), UnicodeAttribute(name="App-ID", type=unicode), ListAttribute(name="accessControlPolicyIDs", type=list), ListAttribute(name="announceTo", type=list), UnicodeAttribute(name="announcedAttribute", type=unicode), ListAttribute(name="childResources", type=list), DatetimeAttribute(name="creationTime", type=datetime), DatetimeAttribute(name="expirationTime", type=datetime), UnicodeAttribute(name="labels", type=unicode), DatetimeAttribute(name="lastModifiedTime", type=datetime), UnicodeAttribute(name="name", type=unicode), UnicodeAttribute(name="nodeLink", type=unicode), UnicodeAttribute(name="ontologyRef", type=unicode), ListAttribute(name="pointOfAccess", type=list)]
As it can be seen, all attributes of the instance have been initialized with default values. For instance, both path
and App_ID
were initialized with None
, while labels
is an empty list
. Since path
is None
, parent_path
is also None
.
Note: It is important to understand that this only created the AE
object internally in our program but not actually in the OneM2M resource tree of a CSE! No interaction with a CSE has taken place yet.
Passing Values
We can pass values for all the attributes that are applicable to a particular resource.
This file can be found here.
# Example 2: Passing Values
from openmtc_onem2m.model import AE
my_app = AE(App_ID="myApp", labels=["keyword1", "keyword2"])
print my_app.path
#>>> None
print my_app.App_ID
#>>> myApp
print my_app.parent_path
#>>> None
print my_app.labels
#>>> [u'keyword1', u'keyword2']
print my_app.attributes
#>>> [UnicodeAttribute(name="AE-ID", type=unicode), UnicodeAttribute(name="App-ID", type=unicode), ListAttribute(name="accessControlPolicyIDs", type=list), ListAttribute(name="announceTo", type=list), UnicodeAttribute(name="announcedAttribute", type=unicode), ListAttribute(name="childResources", type=list), DatetimeAttribute(name="creationTime", type=datetime), DatetimeAttribute(name="expirationTime", type=datetime), UnicodeAttribute(name="labels", type=unicode), DatetimeAttribute(name="lastModifiedTime", type=datetime), UnicodeAttribute(name="name", type=unicode), UnicodeAttribute(name="nodeLink", type=unicode), UnicodeAttribute(name="ontologyRef", type=unicode), ListAttribute(name="pointOfAccess", type=list)]