Node-RED, IOT Foundation Out Node Not Sending Commands

1.3k views Asked by At

I have a Node-RED application that is bound to an IOT Foundation (iotf) service. I can receive events from devices and handle them appropriately.

However, I am now interested in sending commands back to my devices and am having some problems. Nothing is showing up at the device, but by creating an IOTF in node, I can confirm that the command is passing through iotf.

I can definitely get commands to pass through iotf using pure python, as the follow code works well:

Client code:

#!/usr/bin/python

import ibmiotf.device
from time import sleep

options = {
  "org": "cgmncc",
  "type": "table",
  "id": "b827eb764b7a",
  "auth-method": "token",
  "auth-token": "redacted"
}

def myCommandCallback(cmd):
  print('inside command callback')
  print cmd

def main():
  client = ibmiotf.device.Client(options)
  client.connect()
  client.commandCallback = myCommandCallback
  while True:
    sleep(1)

if __name__ == "__main__":
  main()

Application code:

#!/usr/bin/python

import ibmiotf.application

options = {
  "org": "redacted",
  "id": "python app",
  "auth-method": "apikey",
  "auth-key": "redacted",
  "auth-token": "redacted"
}

try:
  client = ibmiotf.application.Client(options)
  client.connect()
  client.publishCommand('table', 'b827eb764b7a', 'test')
  client.disconnect()
except ibmiotf.ConnectionException as e:
  print e

Whenever I run the application code, I see the following output:

root@raspberrypi ~ # ./app.py 
inside command callback
<ibmiotf.device.Command instance at 0x14e8490>

I have a Node-RED iotf output node configured as shown below, but when I trigger the flow, the command callback function doesn't trigger!

enter image description here enter image description here

I'm thinking there maybe something wrong either with trying to use a timestamp trigger to fire the command, or with the way I've configured the output node itself -- any suggestions or advice would be appreciated!

1

There are 1 answers

6
Amit Mangalvedkar On BEST ANSWER

A simple test to check if the commands are reaching IBM IoT Foundation is - developing another flow having an IoT App In node which subscribes to the commands. I am attaching the Node-RED flow for the same here

[
{
    "id": "40560f8b.30693",
    "type": "ibmiot in",
    "authentication": "boundService",
    "apiKey": "",
    "inputType": "cmd",
    "deviceId": "b827eb764b7a",
    "applicationId": "",
    "deviceType": "table",
    "eventType": "",
    "commandType": "test",
    "format": "string",
    "name": "IBM IoT App In",
    "service": "registered",
    "allDevices": false,
    "allApplications": "",
    "allDeviceTypes": false,
    "allEvents": "",
    "allCommands": false,
    "allFormats": false,
    "x": 268,
    "y": 171,
    "z": "6bd610b9.7b40a",
    "wires": [
        [
            "2f9b9c00.8b7ba4"
        ]
    ]
},
{
    "id": "2f9b9c00.8b7ba4",
    "type": "debug",
    "name": "",
    "active": true,
    "console": "false",
    "complete": "false",
    "x": 493,
    "y": 195,
    "z": "6bd610b9.7b40a",
    "wires": []
}
]

It would appear this way in the workspace.
enter image description here

After you have added this flow, you can test the device command publishing from the same workspace.
Can you please try this? Since you would now have 2 debug nodes, you should be able to see the same timetamp output twice. I have tried the same flow, with the same details (except the organization) and it works fine.

Thanks and Regards
Amit M Mangalvedkar