Routing with External Business Rules

This example uses an external Decision Service hosted by IBM Operational Decision Manager (on Bluemix) to perform switch routing based on data retrieved in a previous step.

Here we use a trivial example to replace logic written in code in a scenario taken from (http://flows.nodered.org/flow/6572686) to provide business editable rules which are managed and governed separately from the integration flow.

For example, when deciding the thresholds and logic required to raise alerts and message for the UK Power Demand (http://flows.nodered.org/flow/6572686), the logic is constructed in business friendly (and business-editable) phrases hosted by the ODM platform:

Example 1 - Demand Threshold Rule

if
    the value in GW of 'the power demand' is more than 56
then
    set message to "High Power Usage" ;

Example 2 - Frequency Threshold Decision Table

Frequency Message
< 49.5 Exceeding demand
[49.5, 50.5] Normal
> 50.5 Demand not met
[{"id":"f4b7a0b7.f71ad8","type":"http request","name":"Make Decision","method":"POST","url":"https://ds-46e0b.ng.bluemix.net/DecisionService/rest/v1/energyRuleApp/energyAgent/","x":316,"y":176,"z":"52182ff4.9d4a98","wires":[["513c556e.d8b97c"]]},{"id":"6ebae978.aa315","type":"function","name":"Build Decision Payload","func":"msg.payload = '{\"Power\":{\"valueInWatts\":'+\nmsg.payload.demand*1000.0\n+'}}';\nmsg.headers = {\n \"content-length\": msg.payload.length,\n \"content-type\": \"application/json\"\n};\nreturn msg;","outputs":1,"x":132,"y":176,"z":"52182ff4.9d4a98","wires":[["f4b7a0b7.f71ad8"]]},{"id":"6b712a4b.03ba04","type":"switch","name":"Route based on Decision","property":"payload.message","rules":[{"t":"eq","v":"Nothing unusual here"},{"t":"eq","v":"High Power Usage"}],"checkall":"false","outputs":2,"x":189,"y":249,"z":"52182ff4.9d4a98","wires":[[],["f370acd1.28da1"]]},{"id":"a536b886.396e48","type":"function","name":"Parse UK Power Demand","func":"// does a simple text extract parse of the http output to provide an\n// object containing the uk power demand, frequency and time\n\nif (~msg.payload.indexOf('<BR')) {\nvar words = msg.payload.split(\"div\")[1].split(\"<BR\");\nif (words.length >= 3) {\nmsg.payload = {};\nmsg.payload.demand = parseInt(words[0].split(\":\")[1]);\nmsg.payload.frequency = parseFloat(words[2].split(\":\")[1]);\nmsg.payload.time = words[1].split(\">\")[1];\nmsg2 ={};\nmsg2.payload = (msg.payload.frequency >= 50) ? true : false;\n\nreturn [msg,msg2];\n}\n}\nreturn null;","outputs":"2","x":427,"y":105,"z":"52182ff4.9d4a98","wires":[["6ebae978.aa315","f370acd1.28da1"],[]]},{"id":"3b899889.7859b","type":"httpget","name":"Get UK Power","baseurl":"http://www.nationalgrid.com/ngrealtime/realtime/systemdata.aspx","append":"","x":237,"y":105,"z":"52182ff4.9d4a98","wires":[["a536b886.396e48"]]},{"id":"f370acd1.28da1","type":"debug","name":"","active":true,"console":"true","complete":"false","x":492,"y":246,"z":"52182ff4.9d4a98","wires":[]},{"id":"b2d7417.9c71d4","type":"inject","name":"Tick","topic":"","payload":" ","repeat":"","crontab":"*/5 * * * *","once":false,"x":107,"y":106,"z":"52182ff4.9d4a98","wires":[["3b899889.7859b"]]},{"id":"513c556e.d8b97c","type":"function","name":"Parse Decision Response","func":"msg.payload = JSON.parse(msg.payload);\nreturn msg;","outputs":1,"x":519,"y":176,"z":"52182ff4.9d4a98","wires":[["6b712a4b.03ba04"]]}]
mattcr

Flow Info

created 3 years, 3 months ago

Node Types

Core
  • debug (x1)
  • function (x3)
  • http request (x1)
  • inject (x1)
  • switch (x1)
Other
  • httpget (x1)

Tags

  • odm
  • rules
  • bluemix
  • decision
  • services
  • operational
  • manager
  • ibm
Copy this flow JSON to your clipboard and then import into Node-RED using the Import From > Clipboard (Ctrl-I) menu option