Community Tip - Have a PTC product question you need answered fast? Chances are someone has asked it before. Learn about the community search. X
Hi,
I'm using the Java SDK to automatically create a Thing in ThingWorx with the remotething template and I am attempting to have the two bind properties. Using the below service (which is remotely called from the device), I am able to remotely create a thing. All that needs to be done in order to get the properties is to go into the thing and select "Manage Bindings". I would like to automate that as well so when this service runs, the bindings are also added.
var thingName = ThingName;
var template = ThingTemplate;
var tag = Tag;
var description = Description;
//check if thing exists
try {
var exist = Things[thingName].name;
//If Thing exists, no exception will be thrown
throw new Error("Error creating " + thingName + ". Error: \""+thingName+"\" already exists");
} catch (err) {
// Thing does not exist, does the requested template exist
try {
var exist = ThingTemplates[template].name;
} catch (err){
throw new Error("Error creating " + thingName + ". Error: ThingTemplate \""+template+"\" doesn't exist");
}
//Test is see if thingName meets name rules
// Does it start with a letter
var code = thingName.charCodeAt(0);
if ( !(((code >= 65) && (code <= 90)) //lower case letters
|| ((code >= 97) && (code <= 122)) //uper case letters
|| (code == 95) //underscore
)){
throw new Error("Error creating " + thingName + ". Error: \""+thingName+"\" is not a valid name for a Thing");
} else {
for(var i = 1; i <thingName.length; i++)
{
var code = thingName.charCodeAt(i);
if ( !( ((code >= 65) && (code <= 90)) // lower case letters
|| ((code >= 97) && (code <= 122)) //upper case letters
|| (code == 95) // underscore
|| (code == 46) // period
|| ((code >= 48) && (code <=57)) //numbers
)){
throw new Error("Error creating " + thingName + ". Error: \""+thingName+"\" is not a valid name for a Thing");
}
}
}
// Apply a Tag if provided
var applyTag;
if( tag == undefined){
applyTag = false;
} else if( tag.length>0) {
try{
var params = {
name: tag /* STRING */
};
var exist = ModelTags["Applications"].GetVocabularyTerm(params);
} catch(err){
throw new Error("Error creating " + thingName + ". Error: \""+tag+"\" is not a term in Applications");
}
applyTag = true;
} else {
applyTag = false;
}
try {
var params = {
tags: undefined /* TAGS */,
thingTemplateName: template /* THINGTEMPLATENAME */,
description: description /* STRING */,
name: thingName /* STRING */
};
// no return
Resources["EntityServices"].CreateThing(params);
} catch(err) {
throw("Error creating " + thingName + ". Error:" + err.message);
}
Things[thingName].EnableThing();
Things[thingName].RestartThing();
///Apply the tag
if(applyTag)
{
var tags = new Array();
var newTag = {};
newTag.vocabulary = "Applications";
newTag.vocabularyTerm = tag;
tags.push(newTag);
var params = {
tags: tags /* TAGS */
};
// no return
Things[thingName].AddTags(params);
}
}
Please let me know if you have any questions! Thanks!
Solved! Go to Solution.
Hi All,
Bill was right, I was overthinking the problem. I was able to remotely create a thing by invoking the above service to create a thing. All I had to do was remotely invoke another service that created a property on a thing. Code here:
var params = {
defaultValue: undefined /* STRING */,
description: undefined /* STRING */,
readOnly: undefined /* BOOLEAN */,
type: Type /* BASETYPENAME */,
remote: true /* BOOLEAN */,
remotePropertyName: PropertyName /* STRING */,
timeout: undefined /* INTEGER */,
pushType: undefined /* STRING */,
dataChangeThreshold: undefined /* NUMBER */,
logged: undefined /* BOOLEAN */,
name: PropertyName /* STRING */,
pushThreshold: undefined /* NUMBER */,
dataChangeType: undefined /* STRING */,
category: undefined /* STRING */,
persistent: undefined /* BOOLEAN */,
dataShape: undefined /* DATASHAPENAME */
};
Things[ThingName].AddPropertyDefinition(params);
Things[ThingName].RestartThing();
This one might be easier to solve than you think. If you bind a ThingTemplate to one example virtual thing, then any thing that uses this bound template it will inherit these bindings as well. Hopefully, you are not planning on dynamically binding each device differently as that would be much more complex.
Hi All,
Bill was right, I was overthinking the problem. I was able to remotely create a thing by invoking the above service to create a thing. All I had to do was remotely invoke another service that created a property on a thing. Code here:
var params = {
defaultValue: undefined /* STRING */,
description: undefined /* STRING */,
readOnly: undefined /* BOOLEAN */,
type: Type /* BASETYPENAME */,
remote: true /* BOOLEAN */,
remotePropertyName: PropertyName /* STRING */,
timeout: undefined /* INTEGER */,
pushType: undefined /* STRING */,
dataChangeThreshold: undefined /* NUMBER */,
logged: undefined /* BOOLEAN */,
name: PropertyName /* STRING */,
pushThreshold: undefined /* NUMBER */,
dataChangeType: undefined /* STRING */,
category: undefined /* STRING */,
persistent: undefined /* BOOLEAN */,
dataShape: undefined /* DATASHAPENAME */
};
Things[ThingName].AddPropertyDefinition(params);
Things[ThingName].RestartThing();