[{"id":"ba386057.845d3","type":"mqtt-broker","broker":"192.168.0.58","port":"1883","clientid":"Opensprinkler"},{"id":"39eb56aa.c614aa","type":"emoncms-server","server":"http://192.168.0.58/emoncms","name":"Locally Hosted Emoncms"},{"id":"1b8d1377.e472ed","type":"mqtt-broker","broker":"192.168.0.182","port":"1883","clientid":"Opensprinkler"},{"id":"3a893528.c576ca","type":"mqtt in","name":"Returns/errors from API calls","topic":"OSPI/api-response","broker":"1b8d1377.e472ed","x":211.2972869873047,"y":461.5810241699219,"z":"d3ee92b5.2c117","wires":[["2cfd5217.d302ae","3da446dc.c25bba"]]},{"id":"2cfd5217.d302ae","type":"function","name":"fnSendtoXBMC","func":"var paylmqtt = msg.payload;\nvar topicstr = msg.topic;\n// This is a lvl 2 topic\n// check if there is no payload. If you send a message to a topic with no payload,\n// with retain = true, it will clear retained messages for that topic.\nif (msg.payload == null) {\n return null;\n }\n\noutmsg = msg;\npayloadmqtto = '\"{\"lvl\":\"2\",\"sub\":\"';\npayloadmqtto = payloadmqtto + topicstr + '\",';\npayloadmqtto = payloadmqtto + '\"txt\":\"'+paylmqtt+'\",\"img\":\"/home/pi/.xbmc/userdata/Thumbnails/background.png\",\"delay\": \"30000\"}';\noutmsg.payload = payloadmqtto;\noutmsg.topic = \"Home/xbmc1\";\nreturn [outmsg];","outputs":1,"x":444.5926094055176,"y":430.06917572021484,"z":"d3ee92b5.2c117","wires":[["55c4e9fc.aa3b18"]]},{"id":"e5a6b31.f1a595","type":"mqtt in","name":"Someone logged on lg","topic":"OSPI/lg","broker":"1b8d1377.e472ed","x":191.69968032836914,"y":516.9102554321289,"z":"d3ee92b5.2c117","wires":[["89518f2f.76ae7"]]},{"id":"9e131c10.61ece","type":"emoncms","name":"Log runtimes on Emoncms","emonServer":"39eb56aa.c614aa","nodegroup":"25","x":835.4378852844238,"y":694.2833347320557,"z":"d3ee92b5.2c117","wires":[]},{"id":"dc704ba2.238fb8","type":"comment","name":"Respond to events","info":"Here the MQTT messages that are sent from OSPi are subscribed to, \nreformatted for the appropriate recipient, and sent off.\n\nTo add eg an email message whenever a station starts, simply add another\nflow, subscribing to the start message, create a function to reformat the message \nfor email and pass the message to the email node. Same for twitter etc.\n","x":125.35440063476562,"y":277.9460105895996,"z":"d3ee92b5.2c117","wires":[]},{"id":"89518f2f.76ae7","type":"e-mail","server":"smtp.gmail.com","port":"465","name":"user@domain","dname":"Send to email","x":799.8905029296875,"y":517.0889616012573,"z":"d3ee92b5.2c117","wires":[]},{"id":"ada665bf.525998","type":"mqtt in","name":"System rebooted rb","topic":"OSPI/rb","broker":"1b8d1377.e472ed","x":185.43809509277344,"y":335.27938175201416,"z":"d3ee92b5.2c117","wires":[["4b647220.b49b8c","91e9124b.6e16f"]]},{"id":"91e9124b.6e16f","type":"e-mail","server":"smtp.gmail.com","port":"465","name":"user@domain","dname":"Send email","x":792.2595825195312,"y":334.05312728881836,"z":"d3ee92b5.2c117","wires":[]},{"id":"4b647220.b49b8c","type":"function","name":"fnSendrbtoXBMC","func":"var paylmqtt = msg.payload;\nvar topicstr = msg.topic;\n// check if there is no payload. If you send a message to a topic with no payload,\n// with retain = true, it will clear retained messages for that topic.\nif (msg.payload == null) {\n return null;\n }\n\n// This is a lvl 2 topic\noutmsg = msg;\npayloadmqtto = '\"{\"lvl\":\"2\",\"sub\":\"';\npayloadmqtto = payloadmqtto + topicstr + '\",';\npayloadmqtto = payloadmqtto + '\"txt\":\"'+paylmqtt+'\",\"img\":\"/home/pi/.xbmc/userdata/Thumbnails/background.png\",\"delay\": \"30000\"}';\noutmsg.payload = payloadmqtto;\noutmsg.topic = \"Home/xbmc1\";\nreturn [outmsg];","outputs":1,"x":446.6286315917969,"y":366.3270263671875,"z":"d3ee92b5.2c117","wires":[["770dd5a1.88f22c"]]},{"id":"55c4e9fc.aa3b18","type":"mqtt out","name":"Send errorsto XBMC","topic":"Home/ospi","qos":"0","retain":"false","broker":"ba386057.845d3","x":816.8070678710938,"y":430.0531406402588,"z":"d3ee92b5.2c117","wires":[]},{"id":"f049f8bc.0fb608","type":"mqtt in","name":"Station Name Change (sc)","topic":"OSPI/sc","broker":"1b8d1377.e472ed","x":194.34288787841797,"y":773.8983726501465,"z":"d3ee92b5.2c117","wires":[["62924919.9d6db8","3e638abc.c19c76"]]},{"id":"62924919.9d6db8","type":"function","name":"fnSendsctoXBMC","func":"var paylmqtt = msg.payload;\nvar topicstr = msg.topic;\n// This is a lvl 2 topic\n// check if there is no payload. If you send a message to a topic with no payload,\n// with retain = true, it will clear retained messages for that topic.\nif (msg.payload == null) {\n return null;\n }\n\noutmsg = msg;\npayloadmqtto = '\"{\"lvl\":\"2\",\"sub\":\"';\npayloadmqtto = payloadmqtto + topicstr + '\",';\npayloadmqtto = payloadmqtto + '\"txt\":\"'+paylmqtt+'\",\"img\":\"/home/pi/.xbmc/userdata/Thumbnails/background.png\",\"delay\": \"30000\"}';\noutmsg.payload = payloadmqtto;\noutmsg.topic = \"Home/xbmc1\";\nreturn [outmsg];","outputs":1,"x":406.2953567504883,"y":803.7316989898682,"z":"d3ee92b5.2c117","wires":[["f21d8bc8.0de278"]]},{"id":"3e638abc.c19c76","type":"e-mail","server":"smtp.gmail.com","port":"465","name":"user@domain","dname":"Station change to email","x":827.4857559204102,"y":771.4936256408691,"z":"d3ee92b5.2c117","wires":[]},{"id":"cf0639bd.30f9c8","type":"function","name":"fnBuildurl","func":"// The received message is stored in 'msg'\n// It will have at least a 'payload' property:\n\n// The payload of the injected message contains the hostname and port\n// of the OSPI as csv's\n\nmsgo = msg;\ncontext.host=msg.payload.split(\",\");\n\nmsgo.url = 'http://' + context.host[0] +':' + context.host[1] + '/gv?pw=' + context.host[2];\nmsgo.payload = msgo.url+ \" Get GV variables \";\n\nreturn [msgo]","outputs":"1","x":370.66663360595703,"y":99.90475654602051,"z":"d3ee92b5.2c117","wires":[["6b26b597.94d94c"]]},{"id":"1c4a359b.e3b5ca","type":"function","name":"fnProcessOSPIhttpresponse","func":"// Messages returned \n\n// - errors\n\n// First response processed is from OSPi (to /gv?pw=... - get station names\n\n// This function just loads global variables that mirror the gv variables from OSPi\n\nomsg = msg;\ntopic = msg.topic;\nstatusCode = msg.statusCode;\n\nif (statusCode != 200 ) {\n\n// This error processing does not handle the case when there is no response from OSPI\n\n// Still need to get the api data, so retry \n// need to count errors, and do something when there are too many\n// will add more error processing. For now just return and try again\n// the error message will go to MQTT\n\n msg.topic = \"OSPI/api-response\";\n msg.payload = \"Error reaching server - code \" + statusCode;\n return [omsg];\n} \ncontext.global.runtm = [\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\"];\nmsg.runtm = context.global.runtm[0];\ncontext.global.gmtnow = msg.payload.gmtnow;\ncontext.global.lrun = msg.payload.lrun;\ncontext.global.now = msg.payload.now;\ncontext.global.pd = msg.payload.pd;\ncontext.global.pon = msg.payload.pon;\ncontext.global.rovals = msg.payload.rovals;\ncontext.global.ps = msg.payload.ps;\ncontext.global.rs = msg.payload.rs;\ncontext.global.sbits = msg.payload.sbits;\ncontext.global.scount = msg.payload.scount;\ncontext.global.sd = msg.payload.sd;\ncontext.global.snames = msg.payload.snames;\ncontext.global.srvals = msg.payload.srvals;\nnst = context.global.sd['nst'];\n//for (i=0,i