Using the Rules API
The Rules API provides basic functionality to add, remove, activate, deactivate, and find rules. Each rule is identified by a name and a user. A user cannot have two rules with the same name, but different users can have rules with the same name.
When creating new rules, specify the rule name. To create a new rule, use the same syntax used in the Search API.
After creating a rule, the IoT FND Rules API returns a rule ID, which you can use to refer to the rule for removing, activating, and deactivating, operations. By default, IoT FND activates rules when created with actions.
In your IoT FND NB API client application, use this IoT FND server URL to access the Rules API WSDL:
http://<server_address> /nbapi/rules?wsdl
Example (Python-SUDS Client)
import sys
from suds.client import Client
import logging
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
url = "http://localhost/nbapi/rules?wsdl"
cl = Client(url, username='root', password='Tree123!')
#print cl
#parse the properties of a rule and return a dictionary struct
def parseRule(r):
rule = {}
rule['id'] = r.id
if (r.properties != None and r.properties != ""):
#print r.properties
for p in r.properties.entry:
if (p.key == "literal"):
rule['rule']=p.value
else:
rule[p.key]=p.value
for a in r.actions:
rule['action'] = a.type
rule['label'] = a.parameter
#print rule
return rule
# output a CSV list of rules
users = ['root']
properties = ['username','status', 'lastUpdate', 'name', 'literal']
print "username,rulename,id,status,lastUpdate,rule,action,label"
for u in users:
#print u
result = cl.service.findRulesByUsername(u)
#print result
for r in result:
rule = parseRule(r)
print rule['username']+",",
print rule['name']+",",
print str(rule['id'])+",",
print rule['status']+",",
print rule['lastUpdate']+",",
print rule['rule']+",",
print rule['action']+",",
print rule['label']
# create two new rules
names = ['My New Rule 1', 'My New Rule 2']
myAction1 = cl.factory.create('ruleAction')
myAction1.parameter = 'My Label'
myAction1.type = 'ADD_LABEL'
myAction2 = cl.factory.create('ruleAction')
myAction2.parameter = 'My Label'
myAction2.type = 'REMOVE_LABEL'
myActions = [myAction1,myAction2]
myRule1 = cl.factory.create("createRule")
myRule1.name = names[0]
myRule1.username = users[0]
myRule1.literal = 'deviceType:cgmesh status:down meshRssi<-90 meshHops>5'
myRule1.actions = myAction1
print myRule1
myRule2 = cl.factory.create("createRule")
myRule2.name = names[1]
myRule2.username = users[0]
myRule2.literal = 'label:"My Label" deviceType:cgmesh status:up'
myRule2.actions = myAction2
print myRule2
r = cl.service.createRule(myRule1)
myr1 = parseRule(r)
print myr1
r = cl.service.createRule(myRule2)
myr2 = parseRule(r)
print myr2
# toggle rules by name
for n in names:
#print n
result = cl.service.findRulesByName(n)
if result != None:
#print result
for r in result:
rule = parseRule(r)
if (rule['status'] == "ACTIVATED"):
r = cl.service.deactivateRule(rule['id'])
else:
r = cl.service.activateRule(rule['id'])
rule = parseRule(r)
print rule
sys.exit()
# delete the rules we created
r = dropRule(myr1["id"])
r = dropRule(myr2["id"])