instructables IoT Plant Monitoring System (With IBM IoT Platform) by Qixyqix Overview The Plant Monitoring System (PMS) is an application built with individuals who are in the working class with a green thumb in mind. Today, working individuals are busier than ever before; advancing their careers and managing their finances. Working hours are ever longer, leaving these people less time to do things which they enjoy. This creates a problem for people who have green thumbs, work extra long hours and do not have any domestic helper at home to tend to their plants. Thus, the PMS was created to assist such individuals in providing better care, yet ensuring optimum growth for their plants at home while they work. Summary of steps The following is a summary of the steps that will be done 1. 2. 3. 4. 5. Connecting of hardware Setting up IBM Bluemix IoT Platform Register for twilio Setup raspberry pi (Plant Monitoring Device) node red Setup bluemix node redSetup Webserver IoT Plant Monitoring System (With IBM IoT Platform): Page 1 Step 1: Connect Hardware Hardware Requirements 2 Raspberry Pis 1 Breadboard 1 GPIO Ribbon Cable 1 GPIO Extension Board (T-Cobbler Kit) 1 MCP3008 ADC (Analog Digital Converter) 1 DHT_11 Sensor 2 10k Ohm Resistors 1 Light Dependent Resistor 1 Soil Moisture Sensor (YL-69) 1 Water Level Sensor 26 Cables (16 Male to Male, 10 Male to Female) Connect the parts! Refer to the 2nd Image of this step for the fritzing diagram and connect the parts accordingly IoT Plant Monitoring System (With IBM IoT Platform): Page 2 Step 2: Create IoT Platform Resources 1. Log in your Bluemix account and proceed to the IoT BoilerPlates Starter Page section https://new-console.ng.bluemix.net/catalog/starters/internet-of-things-platform-starter 2. Enter your app name and host name Wait for Bluemix to setup your app and the status shows “Your app is running” If it is still not running after 10 minutes, you may have to restart your app by clicking the restart button located at the top right corner 3. From the side bar, click on “Connections” Click on the iotf service link from the listed connections You will be redirected to the IOT service configuration Click on the “Launch” button to be redirected to the iotf console 4. Take note of the link you are redirected to for example: https://suwdek.internetofthings.ibmcloud.com/dashboard/ The 6 letters infront of “.internetofthings.ibmcloud.com/dashboard/” is your organization ID. Take note of it. IoT Plant Monitoring System (With IBM IoT Platform): Page 3 Step 3: Create Device Type and Device 1. 2. 3. 4. 5. You should be in your IOT Platform console. From the left sidebar, click on the devices icon Click on “Device Types” from the top Click on “Add Device Type” from the top right corner Enter the following information: 1. Type: Device 2. Name: raspberrypi 3. Description: Raspberry Pi 6. 7. 8. 9. Click on Next, then click on Done Click on “Browse” from the top Click on “Add Device” Enter the following information: 1. Select existing device type: raspberrypi 2. DeviceID: pms1 10. Click next till you reach the summary 11. Click on done 12. You will be redirected to the Device Credentials page. Please take note of your device details. This is important as the authentication token cannot be recovered Step 4: Create Service Credentials for Cloudant 1. 2. 3. 4. 5. 6. 7. Go back to your bluemix console (https://console.bluemix.net/dashboard/apps) Click on the cloudantNoSQLDB service under the Cloud Foundry Services On the side, click on Service Credentials Click on the New Credential Button Click Add Click View Credentials in the Action column of your newly created service credentials Take note of these credentials. You will need them later for modification of the app.py code IoT Plant Monitoring System (With IBM IoT Platform): Page 4 Step 5: Register for Twilio 1. Register for a new twilio account at https://www.twilio.com/ 2. Upon registration, you will be prompted to name a project. In my case, i named it Plant Monitoring system. 3. From the sidebar, click on all products and services and click on programmable SMS. 4. Click on “Get Started” As you do not have a twilio number, click on “Get a number” 5. A pop up with a number will show. Click on “use this number” 6. Take note of this twilio number, you will need it later. 7. Go to the console dashboard 8. Take note of your account SID and Auth Token Step 6: Install Required Packages on Plant Monitoring Device 1. Install Node red sudo npm install -g --unsafe-perm node-red 2. Install paho sudo pip install paho-mqtt 3. Install Watson IoT node for node red sudo npm i -g node-red-contrib-ibm-watson-iot 4. Install BCM2835 1. wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.52.tar.gz 2. tar zxvf bcm2835-1.52.tar.gz 3. cd bcm2835-1.48 4. ./configure 5. make 6. sudo make check 7. sudo make install Install 5. Node DHT-Sensor sudo npm install node-dht-sensor 6. Install Node Contrib DHT Sensor sudo npm install --unsafe-perm -g node-red-contrib-dht-sensor 7. Restart your pi sudo reboot now Step 7: Setup Node Red Application for Plant Monitoring Device Start your node red by opening the Terminal and typing node-red start IoT Plant Monitoring System (With IBM IoT Platform): Page 5 <p>Welcome to Node-RED<br>===================</p><p>20 Feb 07:07:34 - [info] Node-RED version: v0.16.2 20 Feb 07:07:34 - [info] Node.js version: v7.8.0 20 Feb 07:07:34 - [info] Linux 4.4.50-v7+ arm LE 20 Feb 07:07:36 - [info] Loading palette nodes { MODE: { MODE_0: 0, MODE_1: 1, MODE_2: 2, MODE_3: 3 }, CS: { none: 64, high: 4, low: 0 }, ORDER: { msb: false, lsb: true }, Spi: [Function: Spi] } 20 Feb 07:07:42 - [info] Settings file : /home/pi/.node-red/settings.js 20 Feb 07:07:42 - [info] User directory : /home/pi/.node-red 20 Feb 07:07:42 - [info] Flows file : /home/pi/.node-red/start 20 Feb 07:07:42 - [info] Server now running at <a href="http://127.0.0.1:1880/"> http://127.0.0.1:1880/ </a> 20 Feb 07:07:42 - [info] Starting flows 20 Feb 07:07:43 - [info] Started flows</p> Open your browser and connect to the node red application Click on the hamburger icon, hover over "import" and click on "clipboard" then paste the code provided below in <p>[{"id":"d9ac3f49.78dc1","type":"tab","label":"Flow 1"},{"id":"9b23dde8.8ae15","type":"pimcp3008","z":"d9ac3f49.78dc1","name":"MCP3008","pin":0,"dnum":0,"x":636.99 6208190918,"y":148.48046493530273,"wires":[["cc10fa6a.91d7f8"]]},{"id":"cc10fa6a.91d7f8","type":"function","z":"d9ac3f49.78dc1","name":"Store light sensor values","fun c":"global.set(\"light\", msg.payload)\nreturn msg;","outputs":1,"noerr":0,"x":869.984447479248,"y":146.67577171325684,"wires":[[]]},{"id":"ab38a13c.d6ce7","type":"inject", "z":"d9ac3f49.78dc1","name":"Get values","topic":"","payload":"","payloadType":"date","repeat":"3","crontab":"","once":false,"x":107.6093978881836,"y":118.00001716613 77,"wires":[["b1fa33c1.cd03"]]},{"id":"55163f38.0f1fb","type":"inject","z":"d9ac3f49.78dc1","name":"Send to bluemix","topic":"","payload":"","payloadType":"date","repeat":" 60","crontab":"","once":false,"x":128.00001525878906,"y":274.000036239624,"wires":[["22b20b42.1732f4"]]},{"id":"87b483ab.ccaff","type":"function","z":"d9ac3f49.78dc1"," name":"Format the msg","func":"light = global.get('light')\nsoil = global.get('soil')\nwater = global.get('water')\ntemperature = global.get('temperature')\nhumidity = global.get(' humidity')\nid = global.get('DeviceId')\nmsg.payload = {'d': {'ip':'169.254.134.248','data':{'lightValue':light,'soilMoisture':soil, 'temperature':temperature, 'humidity': humidity,'wat erLevel':water,'timeTaken':new Date().toString()}}};\nreturn msg;","outputs":1,"noerr":0,"x":560.9961547851562,"y":396.6641960144043,"wires":[["62fa8f9a.ef532"]]},{"id":"62 fa8f9a.ef532","type":"json","z":"d9ac3f49.78dc1","name":"","x":736.9883003234863,"y":398.515661239624,"wires":[["204a6503.df7aca","8f8d1209.41256"]]},{"id":"de7e0a7 a.f3cc68","type":"pimcp3008","z":"d9ac3f49.78dc1","name":"ADC (Water)","pin":"1","dnum":0,"x":646.1000709533691,"y":187.6000156402588,"wires":[["f72a6071.a693e"]] },{"id":"aaa299b.bd09168","type":"pimcp3008","z":"d9ac3f49.78dc1","name":"ADC (Soil)","pin":"2","dnum":0,"x":636.1000709533691,"y":226.6000099182129,"wires":[["394 4c728.9166f8"]]},{"id":"f72a6071.a693e","type":"function","z":"d9ac3f49.78dc1","name":"Store water sensor values","func":"global.set(\"water\", msg.payload)\nreturn msg; ","outputs":1,"noerr":0,"x":870.0000228881836,"y":184.00001525878906,"wires":[[]]},{"id":"3944c728.9166f8","type":"function","z":"d9ac3f49.78dc1","name":"Store water se nsor values","func":"global.set(\"soil\", msg.payload)\nreturn msg;","outputs":1,"noerr":0,"x":870.0000228881836,"y":225.00000953674316,"wires":[[]]},{"id":"33acaa7e.373c e6","type":"function","z":"d9ac3f49.78dc1","name":"Store Temperature Value","func":"global.set(\"temperature\", parseFloat(msg.payload))\nreturn msg;","outputs":1,"noerr ":0,"x":868.1001281738281,"y":270.60001373291016,"wires":[[]]},{"id":"9d8a6040.48843","type":"rpi-dht22","z":"d9ac3f49.78dc1","name":"","topic":"DHT11","dht":"11","pint ype":"0","pin":"19","x":626.1000900268555,"y":282.6000118255615,"wires":[["33acaa7e.373ce6","405fe354.61d30c"]]},{"id":"405fe354.61d30c","type":"function","z":"d9ac3f 49.78dc1","name":"Store Humidity Value","func":"global.set(\"humidity\", parseFloat(msg.humidity))\nreturn msg;","outputs":1,"noerr":0,"x":858.1000747680664,"y":315.80 00373840332,"wires":[[]]},{"id":"204a6503.df7aca","type":"wiotp out","z":"d9ac3f49.78dc1","authType":"d","qs":"false","qsDeviceId":"","deviceKey":"","deviceType":"","devi ceId":"","event":"data","format":"json","qos":"2","name":"","x":897.1001224517822,"y":414.00006198883057,"wires":[]},{"id":"8f8d1209.41256","type":"debug","z":"d9ac3f49 .78dc1","name":"","active":true,"console":"false","complete":"payload","x":919.1001224517822,"y":379.20001125335693,"wires":[]},{"id":"f7f3df6d.8a3eb","type":"wiotp in"," z":"d9ac3f49.78dc1","authType":"d","deviceKey":"","deviceType":"","deviceId":"","command":"RecordValues","commandType":"g","qos":"2","name":"","x":180.100013732 91016,"y":489.60006284713745,"wires":[["c6b07b74.194948","31ba5ffa.4299b"]]},{"id":"89b9f230.889f8","type":"switch","z":"d9ac3f49.78dc1","name":"","property":"payload ","propertyType":"msg","rules":[{"t":"eq","v":"true","vt":"str"}],"checkall":"true","outputs":1,"x":457.10001373291016,"y":174.8000659942627,"wires":[["9b23dde8.8ae15","de 7e0a7a.f3cc68","aaa299b.bd09168","9d8a6040.48843"]]},{"id":"c6b07b74.194948","type":"function","z":"d9ac3f49.78dc1","name":"Set recording","func":"global.set(\"Recor dValues\",msg.payload)\nreturn msg;","outputs":1,"noerr":0,"x":449.1000108718872,"y":486.8000144958496,"wires":[[]]},{"id":"b1fa33c1.cd03","type":"function","z":"d9ac3f 49.78dc1","name":"Get record values setting","func":"msg.payload = global.get(\"RecordValues\");\nreturn msg;","outputs":1,"noerr":0,"x":269.1000061035156,"y":177.800 0659942627,"wires":[["89b9f230.889f8"]]},{"id":"f75c8052.b73d8","type":"inject","z":"d9ac3f49.78dc1","name":"","topic":"Set default on start","payload":"","payloadType":"d ate","repeat":"","crontab":"","once":true,"x":107.10007858276367,"y":72.60006904602051,"wires":[["cd5b2dd8.31093"]]},{"id":"cd5b2dd8.31093","type":"function","z":"d9ac3 f49.78dc1","name":"Set recording to true","func":"global.set(\"RecordValues\",\"true\");\nglobal.set(\"DeviceId\",\"pms1\");\nreturn msg;","outputs":1,"noerr":0,"x":393.10000 99182129,"y":69.8000020980835,"wires":[[]]},{"id":"22b20b42.1732f4","type":"function","z":"d9ac3f49.78dc1","name":"Get record values setting","func":"msg.payload = glo bal.get(\"RecordValues\");\nreturn msg;","outputs":1,"noerr":0,"x":288.10003662109375,"y":340.8000602722168,"wires":[["a5c1ec24.46f3c"]]},{"id":"a5c1ec24.46f3c","type": "switch","z":"d9ac3f49.78dc1","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"true","vt":"str"}],"checkall":"true","outputs":1,"x":468.1000595092 7734,"y":339.80003452301025,"wires":[["87b483ab.ccaff"]]},{"id":"31ba5ffa.4299b","type":"debug","z":"d9ac3f49.78dc1","name":"","active":true,"console":"false","complete ":"payload","x":440.10009002685547,"y":532.2000160217285,"wires":[]}]</p> Make sure to change the "data" and "RecordValues" IoT watson nodes such that it can connect to your application. IoT Plant Monitoring System (With IBM IoT Platform): Page 6 IoT Plant Monitoring System (With IBM IoT Platform): Page 7 Step 8: Setup Node Red Application for Server 1. Log into your bluemix account and go to the dashboard (https://console.bluemix.net/dashboard/apps) 2. Click on the link to your application which is found under the "Route" Column of the list of your Cloud Foundry Apps 3. You will be redirected to another page, click on "go to your node red editor" Similar to the previous step, click on the hamburger icon, hover over "import" and click on "clipboard" then paste the code provided below in <p>[{"id":"5ef69739.4622e8","type":"tab","label":"Flow 4","disabled":false,"info":""},{"id":"ff6a8be6.47bb08","type":"ibmiot in","z":"5ef69739.4622e8","authentication":"bound Service","apiKey":"","inputType":"evt","logicalInterfaceId":"","ruleId":"","deviceId":"","applicationId":"","deviceType":"","eventType":"+","commandType":"","format":"json"," name":"My RaspberryPi Gateway","service":"registered","allDevices":true,"allApplications":"","allDeviceTypes":true,"allEvents":true,"allCommands":"","allFormats":"","qos ":0,"x":150,"y":60,"wires":[["fd7826e.ba07ed8"]]},{"id":"fd7826e.ba07ed8","type":"function","z":"5ef69739.4622e8","name":"Store Pi Payload","func":"var value=msg.payloa d\nmsg.Value=value\nreturn msg;","outputs":1,"noerr":0,"x":150,"y":160,"wires":[["36d60c30.cf6bf4"]]},{"id":"36d60c30.cf6bf4","type":"cloudant in","z":"5ef69739.4622e8"," name":"","cloudant":"","database":"sensor","service":"sp-1530218-cloudantNoSQLDB","search":"_all_","design":"","index":"","x":350,"y":160,"wires":[["5ac01466.11499c"]]} ,{"id":"5ac01466.11499c","type":"function","z":"5ef69739.4622e8","name":"Check if IP Exist","func":"msg.exist=false;\nif(msg.payload.length!=0){\n for(var i=0;i<msg.pa yload.length;i++){\n ="" if(msg.payload[i].pi.ip="=msg.deviceId){\n " msg.exist="true;\n " break;\n ="" }\n ="" }\n="" \n}\nreturn="" msg;","outputs":1,"noerr":0,"x":100,"y":2 80,"wires":[["423e0c3f.a29a14"]]},{"id":"423e0c3f.a29a14","type":"switch","z":"5ef69739.4622e8","name":"","property":"exist","propertytype":"msg","rules":[{"t":"false"},{"t":" true"}],"checkall":"true","repair":false,"outputs":2,"x":290,"y":280,"wires":[["d8ac7a14.abdca8"],["f1aa9184.9aa62"]]},{"id":"d8ac7a14.abdca8","type":"function","z":"5ef6973 9.4622e8","name":"create="" document","func":"msg.payload="{'Pi':{'ip':msg.deviceId,'description':'','SendNotiMsg':false,'RecordValues':true,'Data':[msg.Value.d.data]}}\nret urn" msg;","outputs":1,"noerr":0,"x":510,"y":220,"wires":[["8970318.faf35d"]]},{"id":"8970318.faf35d","type":"cloudant="" out","z":"5ef69739.4622e8","name":"","cloudant":"", "database":"sensor","service":"sp-1530218-cloudantnosqldb","payonly":true,"operation":"insert","x":710,"y":220,"wires":[]},{"id":"f1aa9184.9aa62","type":"function","z":"5ef6 9739.4622e8","name":"update="" document","func":"var="" doc="" ;\nfor(var="" i="0;i<msg.payload.length;i++){\n " msg.payload[i].pi.data.push(msg.value.d.data)\n ="" }\n }\nmsg.payload="doc\nreturn" msg;","outputs":1,"noerr":0,"x":490,"y":280,"wires":[["c6d00c4b.1133f","bd6f8b88.6d8f58"]]},{"id":"c6d00c4b.1133f","type":"cloudant="" out"," z":"5ef69739.4622e8","name":"","cloudant":"","database":"sensor","service":"sp-1530218-cloudantnosqldb","payonly":true,"operation":"insert","x":730,"y":280,"wires":[]},{"id ":"ab7a1a2c.a693e8","type":"inject","z":"5ef69739.4622e8","name":"check="" db","topic":"","payload":"","payloadtype":"date","repeat":"5","crontab":"","once":false,"oncede lay":0.1,"x":90,"y":497,"wires":[["fa28a205.3b18e"]]},{"id":"fa28a205.3b18e","type":"cloudant="" in","z":"5ef69739.4622e8","name":"","cloudant":"","database":"sensor","ser vice":"sp-1530218-cloudantnosqldb","search":"_all_","design":"","index":"","x":250,"y":497,"wires":[["ab4b353f.73e5c8","350cf9f3.3ac216"]]},{"id":"ab4b353f.73e5c8","type": "function","z":"5ef69739.4622e8","name":"get="" activated="" pi","func":"var="" activatedids="[];\nfor(var" if(msg.payload[i].pi.recordvalues){\n ="" activatedids.push({'payl oad':msg.payload[i].pi.ip});\n ="" }\n}\nreturn="" [activatedids];","outputs":1,"noerr":0,"x":440,"y":497,"wires":[["6436cfde.857a9"]]},{"id":"a7fc5617.180d58","type":"twilio="" out","z":"5ef69739.4622e8","service":"_ext_","twilio":"","from":"","number":"","name":"","x":930,"y":440,"wires":[]},{"id":"bd6f8b88.6d8f58","type":"function","z":"5ef69739.4 622e8","name":"check="" if="" notification="" option="" is="" on","func":"var="" sendmsg="false;\nif(msg.payload.Pi.SendNotiMsg==true){\n " if(msg.value.d.data.lightvalu e="">400 || msg.Value.d.data.soilMoisture>600||msg.Value.d.data.temperature>28 || msg.Value.d.data.temperature<25 || msg.Value.d.data.waterLevel>300){\n sg=true\n sendM }\n}\nmsg.payload=sendMsg\nreturn msg;","outputs":1,"noerr":0,"x":600,"y":360,"wires":[["cca33d71.c2a21","4af3f470.59702c"]]},{"id":"cca33d71.c2a21","type ":"switch","z":"5ef69739.4622e8","name":"","property":"payload","propertyType":"msg","rules":[{"t":"true"}],"checkall":"true","repair":false,"outputs":1,"x":850,"y":380,"wires ":[["a0c1e4bf.fa39d8"]]},{"id":"4af3f470.59702c","type":"debug","z":"5ef69739.4622e8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"p ayload","x":870,"y":320,"wires":[]},{"id":"a0c1e4bf.fa39d8","type":"function","z":"5ef69739.4622e8","name":"Set Msg Payload","func":"msg.payload=\"Your current plant en virontment is not Condusive.\"\n +\"\\n This is the current environment details\"\n midity: \"+msg.Value.d.data.humidity\n +\"\\n Temperature: \"+msg.Value.d.data.temperature\n +\"\\n Light Value: \"+msg.Value.d.data.lightValue\n +\"\\n Hu +\"\\n Soil Moisture: \"+msg.Value.d.data.soilMoisture\n +\"\\n Water Level: \"+msg.Value.d.data.waterLevel\nreturn msg;","outputs":1,"noerr":0,"x":730,"y":440,"wires":[["a7fc5617.180d58"]]},{"id":"6436cfde.857a9","type":"functi on","z":"5ef69739.4622e8","name":"Set Payload","func":"msg.deviceId = msg.payload;\nmsg.payload = true;\nreturn msg;","outputs":1,"noerr":0,"x":630,"y":497,"wires":[[" 37eba0a0.59ea4","7a069f4a.6a542"]]},{"id":"37eba0a0.59ea4","type":"ibmiot out","z":"5ef69739.4622e8","authentication":"boundService","apiKey":"","outputType":"cmd","d eviceId":"pms1","deviceType":"raspberrypi","eventCommandType":"RecordValues","format":"boolean","data":"true","qos":"2","name":"IBM IoT","service":"registered","x":8 20,"y":497,"wires":[]},{"id":"7a069f4a.6a542","type":"debug","z":"5ef69739.4622e8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"fals e","x":830,"y":557,"wires":[]},{"id":"350cf9f3.3ac216","type":"function","z":"5ef69739.4622e8","name":"Get Deactivated Pi","func":"var deactivatedIds = [];\nfor(var i=0;i<m sg.payload.length;i++){\n ="" if(!msg.payload[i].pi.recordvalues){\n ="" deactivatedids.push({'payload':msg.payload[i].pi.ip});\n ="" }\n}\nreturn="" [deactivatedids];","output s":1,"noerr":0,"x":450,"y":557,"wires":[["c88ac813.15e468"]]},{"id":"c88ac813.15e468","type":"function","z":"5ef69739.4622e8","name":"set="" payload","func":"msg.devicei d="msg.payload;\nmsg.payload" =="" false;\n\nreturn="" msg;","outputs":1,"noerr":0,"x":630,"y":557,"wires":[["2335fad3.ebf726"]]},{"id":"2335fad3.ebf726","type":"ibmiot=" " out","z":"5ef69739.4622e8","authentication":"boundservice","apikey":"","outputtype":"cmd","deviceid":"pms1","devicetype":"raspberrypi","eventcommandtype":"recordval ues","format":"boolean","data":"false","qos":"2","name":"ibm="" iot","service":"registered","x":820,"y":617,"wires":[]}]<="" p=""></msg.payload.length;i++){\n ></msg.paylo ad.length;i++){\n ></p> Make sure to change the twilio node so that your twilio credentials and twilio number is configured in the node IoT Plant Monitoring System (With IBM IoT Platform): Page 8 Step 9: Setup Pi Web Server IN YOUR SECOND RASPBERRY PI... Install required packages Open the terminal and type in the following commands: sudo pip install gpiozero sudo pip install flask sudo pip install gevent sudo pip install cloudant File Structure Refer to the image of this step for the file structure Download and add additional static content In order to ensure that our web applications looks and works as described, we will need to download and add some additional static content for it to work. Bootstrap v3.3.7 https://github.com/twbs/bootstrap/releases/download/v3.3.7/bootstrap-3.3.7-dist.zip FontAwesome v5.0.1 https://use.fontawesome.com/releases/v5.0.1/fontawesome-free-5.0.1.zip jQuery v3.1.0 https://blog.jquery.com/2016/07/07/jquery-3-1-0-released-no-more-silent-errors/ Morrisjs v0.5.0 https://github.com/morrisjs/morris.js/archive/0.5.0.zip Raphael v2.2.0 https://api.github.com/repos/DmitryBaranovskiy/raphael/zipball/v2.2.0 Bootstrap 1. Open downloaded zip file (bootstrap-3.3.7-dist.zip) IoT Plant Monitoring System (With IBM IoT Platform): Page 9 2. Open the bootstrap-3.3.7-dist folder 3. Extract all contents to Application/static/bootstrap FontAwesome 1. 2. 3. 4. Open downloaded zip file (fontawesome-free-5.0.1.zip) Open the fontawesome-free-5.0.2 folder Open the web-fonts-with-css folder Extract all contents to Application/static/font-awesome jQuery 1. Download jquery-3.1.0.js and jquery-3.1.0.min.js 2. Put both javascript files in Application/static/jquery Morrisjs 1. Open the downloaded zip file (morris.js-0.5.0.zip) 2. Open the morris.js-0.5.0 folder 3. Extract all contents to Application/static/morrisjs Raphael 1. Open the downloaded zip file (raphael-2.2.0.zip) 2. Open the raphael-2.2.0 folder 3. Extract all contents to Application/static/raphael Picture of Setup Pi Web Server Step 10: Add Code for Files in Web Server Download the following files and add them to their respective directories within pi web server Remember to change the service credentials in the app.py fileto your cloudant service credentials NOTE: Due to an issue with uploading the index.html file, I have uploaded it as a .txt file. Please rename it to index.html after downloading it http://www.instructables.com/ORIG/FB0/F20H/JDUKFI2C/FB0F20HJDUKFI2C.py … http://www.instructables.com/ORIG/F77/CAYJ/JDUKFI3A/F77CAYJJDUKFI3A.css … http://www.instructables.com/ORIG/F40/L1TX/JDUKFIGO/F40L1TXJDUKFIGO.txt … IoT Plant Monitoring System (With IBM IoT Platform): Page 10 Download Download Download Step 11: Start It! In your web server pi, run the following commands: cd Application sudo python app.py Nice system. Maybe with something like this, I could actually keep plants alive. IoT Plant Monitoring System (With IBM IoT Platform): Page 11