About using GetRemoteMetadata, here you have a sample code which I use to process it:
var result = Resources["InfoTableFunctions"].CreateInfoTableFromDataShape({
infoTableName : "InfoTable",
dataShapeName : "wupRemotePropertyDefinitionTS"
});
var isRemote = me.ImplementsShape({ thingShapeName: "Connectable" });
var isConnected = false;
var remoteProperties = [];
var ignore;
if (nameLike) nameLike = nameLike.toLowerCase(); // -- nameLike it's a parameter to filter properties by this name
if (isRemote) {
isConnected = me.isConnected;
if (isConnected) {
var metadata = me.GetRemoteMetadata()
if (metadata) {
var propertyDefinitions = metadata.propertyDefinitions;
for (var property in propertyDefinitions) {
if (propertyDefinitions.hasOwnProperty(property)) {
ignore = false;
if (nameLike) {
ignore = (property.toLowerCase().indexOf(nameLike)==-1);
}
if (remotePropertyName) {
ignore = (property!==remotePropertyName);
}
if (!ignore) {
result.AddRow({
name: property,
baseType: propertyDefinitions[property].baseType,
description: propertyDefinitions[property].description,
aspects: propertyDefinitions[property].aspects
});
}
}
}
}
}
}