enum SENSOR{ TEMP=0, PH=1, VBATT=2, TIME=3 } local impData=[0.0, 0.0, 0.0, 0]; const CLEAR_ALL_PH_CAL_VALUES=0 local ph7Cal=0.0; local ph10Cal=0.0; local phCalSlope=0; local phIntercept=0; //loads data from non volatile table on startup function loadTable() { //set to 0 on startup; no need to reinitialize if (!("impData" in t)) //imp sensor data does not { t["impData"]<-impData; } else { impData=t["impData"]; } if (!("ph7Cal" in t)) // make sure 'ph7Cal' is in the table { t["ph7Cal"] <- 0.0; } else //load ph7Cal { ph7Cal=t["ph7Cal"]; } if (!("ph10Cal" in t)) // make sure 'ph10Cal' is in the table { t["ph10Cal"] <- 0.0; } else //load ph10Cal { ph10Cal=t["ph10Cal"]; } server.log("agent startup"); server.log("ph7 cal: " + ph7Cal); server.log("ph10 cal: " + ph10Cal); server.log("data: " + impData) calibratePH(); //calculate other cal values if valid } //adjust raw pH reading using calibration values function adjustPH(rawPH) { if(ph10Cal != 0 && ph7Cal != 0) //both values calibrated { local newPH=rawPH*phCalSlope+phIntercept; return newPH; } else { return rawPH; } } //calculate pH calibration values function calibratePH() { if(ph10Cal != 0.0 && ph7Cal != 0.0) //both values calibrated { phCalSlope=(10-7)/(ph10Cal-ph7Cal); phIntercept=7-ph7Cal*phCalSlope; server.log("agent phCalSlope: " + phCalSlope); server.log("agent phIntercept: " + phIntercept); } } //clear pH calibration values function clearPHCalibrationValues(calLevel) { if(calLevel == CLEAR_ALL_PH_CAL_VALUES) { ph10Cal=0.0; ph7Cal=0.0; server.log("all pH calibration cleared") } phCalSlope=0; phIntercept=0; t["ph7Cal"]=0.0; t["ph10Cal"]=0.0; server.save(t); //update server table } //get and store incoming pH calibration value //and store new value to non volatile server table function recPhCal(level, value) { if(level == 7) { ph7Cal=value; t["ph7Cal"]=value; } else if(level == 10) { ph10Cal=value; t["ph10Cal"]=value; } else { server.log("agent invalid pH cal level: " + level); return; } calibratePH(); server.log("agent cal pH " + level + ": " + value); server.log("agent saving table"); server.save(t); //update server table } #rec data from imp //get pH7 cal value device.on("pH7Cal", function(value) { recPhCal(7, value) }); //get pH10 cal value device.on("pH10Cal", function(value) { recPhCal(10, value) }); device.on("sensorData", function(data) { impData=data; if ( !("impData" in t) ) //table entry does not exist { t["impData"] <- impData; } else { t["impData"] = impData; } local rawPH=impData[SENSOR.PH] impData[SENSOR.PH]=adjustPH(impData[SENSOR.PH]) server.log("agent rec") server.log("raw pH:" + rawPH) server.log("rec time:" + impData[SENSOR.TIME]) server.log("rec temp:" + impData[SENSOR.TEMP]) server.log("adj pH:" + impData[SENSOR.PH]) server.log("rec vbatt:" + impData[SENSOR.VBATT]) }); http.onrequest(function(request, response) { local code = null; local message = null; //server.log("request path: " + request.path) if (request.path == "/phCal") { code = 200; message = "ph10:" + ph10Cal + "\r\nph7:" + ph7Cal + "\r\nslope:" + phCalSlope + "\r\nint:" + phIntercept; } else if (request.path == "/phCalClear") { code = 200; clearPHCalibrationValues(CLEAR_ALL_PH_CAL_VALUES); message="success"; server.log("pH calibration values cleared") } else { code = 200; message = "time:" + impData[SENSOR.TIME] + "\r\ntemp:" + impData[SENSOR.TEMP] + "\r\npH:" + impData[SENSOR.PH] + "\r\nvbatt:" + impData[SENSOR.VBATT]; } response.send(code, message); }); //startup code //get data t <- server.load(); loadTable(); //load pH cal values