Alervator

IoT flow

[{"id":"c5b9fa92.240828","type":"tab","label":"Project","disabled":false,"info":""},{"id":"7efaa94d.e3db48","type":"ruuvitag","z":"c5b9fa92.240828","name":"","x":520,"y":200,"wires":[["69cecc8d.b3e054"]]},{"id":"5a7f00bf.f5d6e","type":"scan ble","z":"c5b9fa92.240828","uuids":"","duplicates":true,"name":"","x":330,"y":200,"wires":[["7efaa94d.e3db48"]]},{"id":"b069ccee.708c8","type":"debug","z":"c5b9fa92.240828","name":"","active":false,"console":"false","complete":"payload","x":750,"y":280,"wires":[]},{"id":"2f481c52.e32ae4","type":"function","z":"c5b9fa92.240828","name":"On/off scanning","func":"var status = flow.get(\"switch\") || \"on\"\naction = false\nif(status === \"off\"){\n    action = true\n    flow.set(\"switch\", \"on\")\n}else{\n    flow.set(\"switch\", \"off\")\n}\nmsg.payload = {}\nmsg.payload.scan = action\nreturn msg;","outputs":1,"noerr":0,"x":440,"y":80,"wires":[["5a7f00bf.f5d6e"]]},{"id":"f1c17cd6.9ad12","type":"inject","z":"c5b9fa92.240828","name":"Switch to on/off scanning","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":170,"y":80,"wires":[["2f481c52.e32ae4"]]},{"id":"eb0baa09.3b9d28","type":"function","z":"c5b9fa92.240828","name":"Add data","func":"    accelerationX = parseInt(msg.payload.accelerationX);\n    accelerationY = parseInt(msg.payload.accelerationY);\n    accelerationZ = parseInt(msg.payload.accelerationZ);\n    acceleration = Math.sqrt(accelerationX*accelerationX + accelerationY*accelerationY +accelerationZ*accelerationZ);\n\n    var d = new Date();\n    msg.payload.piId = msg.detectedBy;\n    msg.payload.tagId = msg.peripheralUuid;\n    msg.payload.timestamp = d;\n    msg.payload.latitude = 1.2979381;\n    msg.payload.longitude = 103.8467304;\n    msg.payload.acceleration = acceleration;\nreturn msg","outputs":1,"noerr":0,"x":520,"y":280,"wires":[["b069ccee.708c8","56060b05.2d0144","ae4a6bb3.449ad8","49a132e0.a1b1fc","baa871c6.34f5f","3b6ddf7d.0ecaf"]]},{"id":"69cecc8d.b3e054","type":"json","z":"c5b9fa92.240828","name":"","pretty":false,"x":370,"y":280,"wires":[["eb0baa09.3b9d28"]]},{"id":"93efd932.dd7398","type":"inject","z":"c5b9fa92.240828","name":"Timer to send data","topic":"","payload":"","payloadType":"date","repeat":"10800","crontab":"","once":false,"x":140,"y":660,"wires":[[]]},{"id":"38b1c907.9e3886","type":"http request","z":"c5b9fa92.240828","name":"Send data","method":"POST","ret":"obj","url":"https://3otqbstmz6.execute-api.us-east-1.amazonaws.com/prod/insert","tls":"","x":720,"y":660,"wires":[["61f59d9e.096434","9ccb24fa.e916e8"]]},{"id":"ae4a6bb3.449ad8","type":"function","z":"c5b9fa92.240828","name":"Detect humidity fault","func":"humidityMean = flow.get(\"humidityMean\") || null;\nhumiditySD = flow.get(\"humiditySD\") || null;\n\nif(humidityMean === null || humiditySD === null){\n    return null;\n}\n\nhumidity = msg.payload.humidity;\n//humidityUpperThreshold = 62.65118;\n//humidityLowerThreshold = 51.06031;\nhumidityZScore = (humidity - humidityMean) / humiditySD;\nfaultHumidity = flow.get(\"faultHumidity\") || 0;\nfaultHumidityThreshold = 10;\n\n//if(humidity > humidityUpperThreshold || humidity < humidityLowerThreshold){\nif(humidityZScore > 3 || humidityZScore < -3){  \n    faultHumidity++;\n    if(faultHumidity >= faultHumidityThreshold){\n        flow.set(\"faultHumidity\", 0);\n        timestamp = msg.payload.timestamp;\n        tagId = msg.payload.tagId;\n        symptoms = \"humidity\";\n        msg.payload = {};\n        msg.payload.timestamp = timestamp;\n        msg.payload.tagId = tagId;\n        msg.payload.symptoms = symptoms;\n        return msg;\n    }\n}\n\nflow.set(\"faultHumidity\", faultHumidity);\nreturn null;","outputs":1,"noerr":0,"x":600,"y":520,"wires":[["c28fabcf.04ed78","32275466.cc7e3c"]]},{"id":"3b6ddf7d.0ecaf","type":"function","z":"c5b9fa92.240828","name":"Detect temperature fault","func":"temperatureMean = flow.get(\"temperatureMean\") || null;\ntemperatureSD = flow.get(\"temperatureSD\") || null;\n\nif(temperatureMean === null || temperatureSD === null){\n    return null;\n}\n\n\ntemperature = msg.payload.temperature;\n//temperatureUpperThreshold = 29.61631;\n//temperatureLowerThreshold = 28.50971;\ntemperatureZScore = (temperature - temperatureMean) / temperatureSD;\nfaultTemperature = flow.get(\"faultTemperature\") || 0;\nfaultTemperatureThreshold = 10;\n//if(temperature > temperatureUpperThreshold || temperature < temperatureLowerThreshold){\nif(temperatureZScore > 3 || temperatureZScore < -3){  \n    faultTemperature++;\n    if(faultTemperature >= faultTemperatureThreshold){\n        flow.set(\"faultTemperature\", 0);\n        timestamp = msg.payload.timestamp;\n        tagId = msg.payload.tagId;\n        symptoms = \"temperature\"\n        msg.payload = {};\n        msg.payload.timestamp = timestamp;\n        msg.payload.tagId = tagId;\n        msg.payload.symptoms = symptoms;\n        return msg;\n    }\n}\n\nflow.set(\"faultTemperature\", faultTemperature);\nreturn null;","outputs":1,"noerr":0,"x":590,"y":580,"wires":[["c28fabcf.04ed78","32275466.cc7e3c"]]},{"id":"25ce03cf.42a67c","type":"json","z":"c5b9fa92.240828","name":"","pretty":false,"x":530,"y":620,"wires":[["e3d856c3.90b048","38b1c907.9e3886"]]},{"id":"56060b05.2d0144","type":"function","z":"c5b9fa92.240828","name":"Detect accelerationZ fault","func":"accelerationZMean = flow.get(\"accelerationZMean\") || null;\naccelerationZSD = flow.get(\"accelerationZSD\") || null;\n\nif(accelerationZMean === null || accelerationZSD === null){\n    return null;\n}\n\naccelerationZ = msg.payload.accelerationZ;\n//accelerationZUpperThreshold = 19.80212;\n//accelerationZLowerThreshold = -33.9844\naccelerationZZScore = (accelerationZ - accelerationZMean) / accelerationZSD;\nfaultAccelerationZ = flow.get(\"faultAccelerationZ\") || 0;\nfaultAccelerationZThreshold = 10;\n//if(accelerationZ > accelerationZUpperThreshold || accelerationZ < accelerationZLowerThreshold){\nif(accelerationZZScore > 3 || accelerationZZScore < -3){  \n    faultAccelerationZ++;\n    if(faultAccelerationZ >= faultAccelerationZThreshold){\n        flow.set(\"faultAccelerationZ\", 0);\n        timestamp = msg.payload.timestamp;\n        tagId = msg.payload.tagId;\n        symptoms = \"acceleration on Z axis\";\n        msg.payload = {};\n        msg.payload.timestamp = timestamp;\n        msg.payload.tagId = tagId;\n        msg.payload.symptoms = symptoms;\n        return msg;\n    }\n}\n\nflow.set(\"faultAccelerationZ\", faultAccelerationZ);\nreturn null;","outputs":1,"noerr":0,"x":590,"y":460,"wires":[["c28fabcf.04ed78","32275466.cc7e3c"]]},{"id":"49a132e0.a1b1fc","type":"function","z":"c5b9fa92.240828","name":"Add sensor data to array","func":"sensorData = msg.payload;\naggData = flow.get(\"aggData\") || [];\naggIndex = parseInt(flow.get(\"aggIndex\")) || 0;\n\nif(aggData === []){\n    //aggData = [];\n    aggData[aggIndex] = sensorData;\n    aggIndex++;\n    flow.set(\"aggData\", aggData);\n    flow.set(\"aggIndex\", aggIndex);\n    msg.payload = aggData;\n    return msg;\n}else{\n    aggData[aggIndex] = sensorData;\n    aggIndex++;\n    flow.set(\"aggData\", aggData);\n    flow.set(\"aggIndex\", aggIndex);\n    msg.payload = aggData;\n    return msg;\n}","outputs":1,"noerr":0,"x":290,"y":420,"wires":[["4b0cab4c.d91914"]]},{"id":"31242173.60936e","type":"function","z":"c5b9fa92.240828","name":"Read agg data from flow","func":"\naggData = flow.get(\"aggData\") || [];\nif(aggData === []){\n    return null;\n}\nmsg.headers = {'content-type':'application/json'};\nmsg.payload = {}; \nmsg.payload.message = aggData;\nreturn msg;","outputs":1,"noerr":0,"x":310,"y":580,"wires":[["c7b16973.c4cdd8","25ce03cf.42a67c"]]},{"id":"4b0cab4c.d91914","type":"debug","z":"c5b9fa92.240828","name":"","active":false,"console":"false","complete":"false","x":355,"y":491,"wires":[]},{"id":"61f59d9e.096434","type":"function","z":"c5b9fa92.240828","name":"Clear data from flow and set mean and SD","func":"\nflow.set(\"aggData\", []);\nflow.set(\"aggIndex\", 0);\n\nstatsPair = msg.payload.message.statsPair;\nflow.set(\"accelerationXMean\", statsPair.accelerationX.mean);\nflow.set(\"accelerationXSD\", statsPair.accelerationX.sd);\n\nflow.set(\"accelerationYMean\", statsPair.accelerationY.mean);\nflow.set(\"accelerationYSD\", statsPair.accelerationY.sd);\n\nflow.set(\"accelerationZMean\", statsPair.accelerationZ.mean);\nflow.set(\"accelerationZSD\", statsPair.accelerationZ.sd);\n\nflow.set(\"humidityMean\", statsPair.humidity.mean);\nflow.set(\"humiditySD\", statsPair.humidity.sd);\n\nflow.set(\"temperatureMean\", statsPair.temperature.mean);\nflow.set(\"temperatureSD\", statsPair.temperature.sd);\n\nreturn msg;","outputs":1,"noerr":0,"x":1070,"y":660,"wires":[["2b733c98.3f35a4"]]},{"id":"51db0e41.057b4","type":"inject","z":"c5b9fa92.240828","name":"Switch to clear data from flow","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":873,"y":794,"wires":[["61f59d9e.096434"]]},{"id":"a72759a9.53d528","type":"http request","z":"c5b9fa92.240828","name":"Sent alert","method":"GET","ret":"txt","url":"https://3otqbstmz6.execute-api.us-east-1.amazonaws.com/prod/alert?message={{{payload}}}","tls":"","x":1000,"y":380,"wires":[["faf07778.c7e4c8","7fb8ff46.cf624"]]},{"id":"c52d303e.2a1e2","type":"function","z":"c5b9fa92.240828","name":"Detect accelerationY fault","func":"accelerationYMean = flow.get(\"accelerationYMean\") || null;\naccelerationYSD = flow.get(\"accelerationYSD\") || null;\n\nif(accelerationYMean === null || accelerationYSD === null){\n    return null;\n}\n\naccelerationY = msg.payload.accelerationY;\n//accelerationYUpperThreshold = 842.076;\n//accelerationYLowerThreshold = 724.9189;\naccelerationYZScore = (accelerationY - accelerationYMean) / accelerationYSD;\nfaultAccelerationY = flow.get(\"faultAccelerationY\") || 0;\nfaultAccelerationYThreshold = 10;\n//if(accelerationY > accelerationYUpperThreshold  || accelerationY < accelerationYLowerThreshold){\nif(accelerationYZScore > 3 || accelerationYZScore < -3){  \n    faultAccelerationY++;\n    if(faultAccelerationY >= faultAccelerationYThreshold){\n        flow.set(\"faultAccelerationY\", 0);\n        timestamp = msg.payload.timestamp;\n        tagId = msg.payload.tagId;\n        symptoms = \"acceleration on Y axis\"\n        msg.payload = {};\n        msg.payload.timestamp = timestamp;\n        msg.payload.tagId = tagId;\n        msg.payload.symptoms = symptoms;\n        return msg;\n    }\n}\n\nflow.set(\"faultAccelerationY\", faultAccelerationY);\nreturn null;","outputs":1,"noerr":0,"x":590,"y":400,"wires":[["c28fabcf.04ed78","32275466.cc7e3c"]]},{"id":"baa871c6.34f5f","type":"function","z":"c5b9fa92.240828","name":"Detect accelerationX fault","func":"accelerationXMean = flow.get(\"accelerationXMean\") || null;\naccelerationXSD = flow.get(\"accelerationXSD\") || null;\n\nif(accelerationXMean === null || accelerationXSD === null){\n    return null;\n}\n\naccelerationX = msg.payload.accelerationX;\n//accelerationXUpperThreshold = 691.7088; // 3 SD from mean based on collected data\n//accelerationXLowerThreshold = 590.5625;\naccelerationXZScore = (accelerationX - accelerationXMean) / accelerationXSD;\nfaultAccelerationX = flow.get(\"faultAccelerationX\") || 0;\nfaultAccelerationXThreshold = 10;\n//if(accelerationX > accelerationXUpperThreshold || accelerationX < accelerationXLowerThreshold){\nif(accelerationXZScore > 3 || accelerationXZScore < -3){  \n    faultAccelerationX++;\n    if(faultAccelerationX >= faultAccelerationXThreshold){\n        flow.set(\"faultAccelerationX\", 0);\n        timestamp = msg.payload.timestamp;\n        tagId = msg.payload.tagId;\n        symptoms = \"acceleration on X axis\";\n        msg.payload = {};\n        msg.payload.timestamp = timestamp;\n        msg.payload.tagId = tagId;\n        msg.payload.symptoms = symptoms;\n        return msg;\n    }\n}\n\nflow.set(\"faultAccelerationX\", faultAccelerationX);\nreturn null;","outputs":1,"noerr":0,"x":590,"y":360,"wires":[["c28fabcf.04ed78","32275466.cc7e3c"]]},{"id":"9ccb24fa.e916e8","type":"debug","z":"c5b9fa92.240828","name":"","active":false,"console":"false","complete":"payload","x":779,"y":720,"wires":[]},{"id":"c28fabcf.04ed78","type":"debug","z":"c5b9fa92.240828","name":"","active":true,"console":"false","complete":"payload","x":848,"y":476,"wires":[]},{"id":"c7b16973.c4cdd8","type":"debug","z":"c5b9fa92.240828","name":"","active":false,"console":"false","complete":"payload","x":315,"y":751,"wires":[]},{"id":"32275466.cc7e3c","type":"json","z":"c5b9fa92.240828","name":"","pretty":false,"x":833,"y":382,"wires":[["a72759a9.53d528"]]},{"id":"faf07778.c7e4c8","type":"debug","z":"c5b9fa92.240828","name":"","active":true,"console":"false","complete":"false","x":1214,"y":382,"wires":[]},{"id":"2b733c98.3f35a4","type":"debug","z":"c5b9fa92.240828","name":"","active":true,"console":"false","complete":"payload","x":1170,"y":760,"wires":[]},{"id":"e3d856c3.90b048","type":"debug","z":"c5b9fa92.240828","name":"","active":false,"console":"false","complete":"payload","x":582.0764312744141,"y":791.4687881469727,"wires":[]},{"id":"e383ad4d.06d66","type":"inject","z":"c5b9fa92.240828","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":75.07986450195312,"y":586.2951736450195,"wires":[["31242173.60936e"]]},{"id":"74ad0677.e8e0e8","type":"grovepi-led","z":"c5b9fa92.240828","name":"LED","pin":"8","set":"","x":1290,"y":480,"wires":[]},{"id":"7fb8ff46.cf624","type":"function","z":"c5b9fa92.240828","name":"On LED","func":"\nmsg.payload = 255;\nreturn msg;","outputs":1,"noerr":0,"x":1082.9618682861328,"y":497.2153091430664,"wires":[["74ad0677.e8e0e8"]]},{"id":"782624f3.0c31ac","type":"inject","z":"c5b9fa92.240828","name":"Switch to off LED","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"x":970,"y":580,"wires":[["309f83b3.66578c"]]},{"id":"309f83b3.66578c","type":"function","z":"c5b9fa92.240828","name":"Off LED","func":"\nmsg.payload = 0;\nreturn msg;","outputs":1,"noerr":0,"x":1212.6320037841797,"y":571.3299026489258,"wires":[["74ad0677.e8e0e8"]]},{"id":"99a7ca45.037348","type":"function","z":"c5b9fa92.240828","name":"Simulate acceleration threshold","func":"var d = new Date();\n\nmsg.payload = {};\nmsg.payload.timestamp = d;\nmsg.payload.tagId = \"c80a417d84b9\";\nmsg.payload.symptoms = \"acceleration on Z axis\";\nreturn msg;","outputs":1,"noerr":0,"x":910,"y":180,"wires":[["32275466.cc7e3c","c28fabcf.04ed78"]]},{"id":"1460e614.46fd2a","type":"inject","z":"c5b9fa92.240828","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":715.0799102783203,"y":95.96527862548828,"wires":[["99a7ca45.037348"]]}]

Flow Info

Created 6 years, 11 months ago
Rating: not yet rated

Owner

Actions

Rate:

Node Types

Core
  • debug (x8)
  • function (x13)
  • http request (x2)
  • inject (x6)
  • json (x3)
Other
  • grovepi-led (x1)
  • ruuvitag (x1)
  • scan ble (x1)
  • tab (x1)

Tags

Copy this flow JSON to your clipboard and then import into Node-RED using the Import From > Clipboard (Ctrl-I) menu option