smartapp-sdk-nodejs icon indicating copy to clipboard operation
smartapp-sdk-nodejs copied to clipboard

question: design limitation precludes a common event handler?

Open toddaustin07 opened this issue 3 years ago • 2 comments

When defining device subscription handlers, you cannot name a common handler across subscriptions. The SDK design seems to impose a unique handler name for each subscription. If I want to support nearly all SmartThings capabilities, I would have a potentially LARGE number of subscriptions to handle, but the current design forces me to declare a unique handler for each, resulting in an unnecessary proliferation of code.

What I want to do is this:

context.api.subscriptions.subscribeToDevices(context.config.buttonList, 'button', 'button', 'commonhandler'))
context.api.subscriptions.subscribeToDevices(context.config.contactList, contactSensor', contact', 'commonhandler'))
.
.
.
context.api.subscriptions.subscribeToDevices(context.config.motionList, 'motionSensor', motion', 'commonhandler'))

subscribedEventHandler('commonHandler', (context, deviceEvent) => {
   <do common stuff>
}

However, I get a subscriptionName conflict error if I try to do that. What I seem to be forced to do is define unique handlers for each like this:

context.api.subscriptions.subscribeToDevices(context.config.buttonList, 'button', 'button', 'buttonhandler'))
context.api.subscriptions.subscribeToDevices(context.config.contactList, contactSensor', contact', 'contacthandler'))
.
.
.
context.api.subscriptions.subscribeToDevices(context.config.motionList, 'motionSensor', motion', 'motionhandler'))

subscribedEventHandler('buttonHandler', (context, deviceEvent) => {
   <do same stuff, or call a common do-stuff routine here>
}

subscribedEventHandler('contactHandler', (context, deviceEvent) => {
   <do same stuff, or call a common do-stuff routine here>
}
.
.
.
subscribedEventHandler('motionHandler', (context, deviceEvent) => {
   <do same stuff, or call a common do-stuff routine here>
}

Is there a better way to accomplish this or perhaps this is a needed design change in the SDK?

toddaustin07 avatar Jun 28 '22 17:06 toddaustin07

Unique subscription names are a limitation of the underlying API, not just the SDK, but I can't think of any reason offhand why they need to be unique. We'll investigate.

bflorian avatar Jun 30 '22 12:06 bflorian

We're pursuing an API change that will no longer require subscription names to be unique. We'll leave this issue open and update it when we have a release date.

A work-around you could do in the meantime is to declare the handler separately from the handler registration commands. It's still more code than should be necessary, but a little more maintainable than having a separate inline function in each subscribedEventHandler call.

const deviceHandler = (context, deviceEvent) => {
  <do some stuff>
}

subscribedEventHandler('buttonHandler', deviceHandler)
subscribedEventHandler('contactHandler', deviceHandler)
.
.
.
subscribedEventHandler('motionHandler', , deviceHandler)

bflorian avatar Jul 06 '22 12:07 bflorian