As part of the Geotab system settings, you can define a list of properties that could be applied to Assets (additional metadata fields that is stored with the Asset). How can I get these Asset Property fields and values using the SDK?

As part of the Geotab system settings, you can define a list of properties that could be applied to Assets (additional metadata fields that is stored with the Asset). How can I get these Asset Property fields and values using the SDK?

You need to be logged in to reply to this post and participate in the Geotab Community discussions.
Edited by DarenPorter-1148
In the C# NuGet SDK, any Entity that can have custom properties will implement the `ICustomizable<T>` generic interface, which exposes a `CustomProperties` property:
// Device is one of the Entities that implements ICustomizable<T>
// Assuming you've retrieved your populated device...
List<PropertyValue<Device>> customProperties = device.CustomProperties;
// Accessing keys (names) and values
var firstProp = customProperties[0];
var propName = firstProp.Property.Name;
var propValue = firstProp.Value;
Edited by DarenPorter-1148
In the C# NuGet SDK, any Entity that can have custom properties will implement the `ICustomizable<T>` generic interface, which exposes a `CustomProperties` property:
// Device is one of the Entities that implements ICustomizable<T>
// Assuming you've retrieved your populated device...
List<PropertyValue<Device>> customProperties = device.CustomProperties;
// Accessing keys (names) and values
var firstProp = customProperties[0];
var propName = firstProp.Property.Name;
var propValue = firstProp.Value;
Hey @DarenPorter-1148
Thanks for your feedback. Using your input I was able to get to the Asset Custom Properties. For anyone seeing this post in the future, here is a sample that you can run in the API Runner | MyGeotab | Geotab Developers:
var desiredDevices = ['b1'];
api.call("Get",{
"typeName":"Device",
}, function(devices) {
devices.forEach(function(device){
if(desiredDevices.indexOf(device.id) > -1){
console.log(`Custom Properties for device ${device.serialNumber}`);
device.customProperties.forEach(function(customProp){
//console.log(JSON.stringify(customProp));
var propName = String(customProp.property.name);
var propValue = customProp.value
console.log(`${propName}: ${propValue}`);
});
}
});
}, function(e) {
console.error("Failed:", e);
});
PC
No problem, I'm glad it helped!
Not directly related to your question, but for potential future readers - if you know you're only interested in one device (like in the example above), it's much more efficient to include a search in the Get call so only that Device gets returned:
api.call("Get", {
"typeName": "Device",
"search": {
"id": "b1"
}
}, function(devices) {
let device = devices[0];
console.log(`Custom Properties for device ${device.serialNumber}`);
device.customProperties.forEach(customProp => {
let propName = String(customProp.property.name);
let propValue = customProp.value;
console.log('${propName}: ${propValue}');
});
}, function(e) {
console.error("Failed:", e);
});
PS - There is no way of getting these fields in a standard Geotab report (the Excel version)??
You could do it with a customized report. You can view this document to find the headers for these custom properties you would need to add to the report: [PUB] MyGeotab Reports Columns/Headers