Field Leaf Test


Protocol test, combining _The One v3_ and _Chlorophyll content_
//============================================
// Macro for data evaluation on PhotosynQ.org
// created: 2/24/2016
//============================================

var data = json.data_raw;

var output = {};

//output["flag"] = {"info":[],"warning":[],"danger":[]};
var sample_cal = MathMEAN(data.slice(2,18));

var inverse_intensity = [1/692,1/614,1/537,1/460];

// retrieve the baseline information from the data JSON and save (using measuring light 15, calibrating light 14)
//----------------------------
for (i in json.get_ir_baseline) {	
	if (json.get_ir_baseline[i][0] == 15) {
		var slope_light = json.get_ir_baseline[i][1];
		var yint_light = json.get_ir_baseline[i][2];
	}
	if (json.get_ir_baseline[i][0] == 14) {
		var slope_cal = json.get_ir_baseline[i][1];
		var yint_cal = json.get_ir_baseline[i][2];
	}
}

// calculate the baseline
//----------------------------
var shinyness = (sample_cal-yint_cal)/slope_cal; // where 0 is dull black electrical tape, and 1 is shiny aluminum
var baseline = slope_light*shinyness+yint_light;

if (!baseline) {
  baseline = 0;
}

// Set our Apparent FmPrime, 3 FmPrime steps, and Fs to calculate both traditional fv/fm and new Multi-phase flash fv/fm
//----------------------------
var Fs = MathMEAN(data.slice(21,24)) - baseline; // take only the first 4 values in the Fs range, excluding the very first
var Fs_std = MathSTDEV(data.slice(21,24)); // create standard deviation for this value for error checking

var sat_vals = data.slice(45,68).sort();  // sort the saturating light values from low to high
var AFmP = MathMEAN(sat_vals.slice(2,20)) - baseline; // take the 18 largest values and average them
var AFmP_std = MathSTDEV(sat_vals); // create standard deviation for this value for error checking

sat_vals = data.slice(104,130).sort();  // sort the saturating light values from low to high
var FmP_end = MathMEAN(sat_vals.slice(2,23)) - baseline; // take the 21 largest values and average them
var FmP_end_std = MathSTDEV(sat_vals); // create standard deviation for this value for error checking

sat_vals = data.slice(72,80).sort();  // sort the saturating light values from low to high
var FmP_step1 = MathMEAN(sat_vals.slice(2,6)) - baseline; // take the 4 largest values and average them
var FmP_step1_std = MathSTDEV(sat_vals); // create standard deviation for this value for error checking

sat_vals = data.slice(82,90).sort();  // sort the saturating light values from low to high
var FmP_step2 = MathMEAN(sat_vals.slice(2,6)) - baseline; // take the 4 largest values and average them
var FmP_step2_std = MathSTDEV(sat_vals); // create standard deviation for this value for error checking

sat_vals = data.slice(92,100).sort();  // sort the saturating light values from low to high
var FmP_step3 = MathMEAN(sat_vals.slice(2,6)) - baseline; // take the 4 largest values and average them
var FmP_step3_std = MathSTDEV(sat_vals); // create standard deviation for this value for error checking

// Calculations for F0'
// ----------------------------
var FoPrime_values = json.data_raw.slice(180,290).sort();
var FoPrime = MathMEAN(FoPrime_values.slice(5,10)) - baseline;
var FoPrime_std = MathSTDEV(FoPrime_values); // create standard deviation for this value for error checking

// Calculations for corrected FmPrime using multi-phase flash
// ----------------------------
var reg = MathLINREG(inverse_intensity, [AFmP,FmP_step1,FmP_step2,FmP_step3]);

// Calculate Phi2 w/ and w/out multi-phase flash
// ----------------------------
var fvfm_noMPF = (AFmP-Fs)/AFmP;
var fvfm_MPF = (reg.b-Fs)/reg.b;


// Calculate NPQt, PhiNPQ, PhiNO, qL w/ and w/out multi-phase flash
// ----------------------------
var npqt_MPF = (4.88 / ((reg.b / FoPrime) -1) )-1;
var npqt_noMPF = (4.88 / ((AFmP / FoPrime) -1) )-1;
var qL_MPF = ((reg.b - Fs)*FoPrime)/((reg.b-FoPrime)*Fs);
var qL_noMPF = ((AFmP - Fs)*FoPrime)/((AFmP-FoPrime)*Fs);
var PhiNO_MPF = 1/(npqt_MPF + 1 + qL_MPF*4.88); //based on equation 52 in Kramer et al., 2004 PRES
var PhiNO_noMPF = 1/(npqt_noMPF + 1 + qL_noMPF*4.88); //based on equation 52 in Kramer et al., 2004 PRES
var PhiNPQ_MPF = 1-fvfm_MPF-PhiNO_MPF; //based on equation 53 in Kramer et al., 2004 PRES 
var PhiNPQ_noMPF = 1-fvfm_noMPF-PhiNO_noMPF; //based on equation 53 in Kramer et al., 2004 PRES 
var qP_MPF = (reg.b - Fs)/(reg.b - FoPrime);
var qP_noMPF = (FmPrime - Fs)/(FmPrime - FoPrime);
var FvP_FmP_MPF = (reg.b-FoPrime)/reg.b;
var FvP_FmP_noMPF = (AFmP-FoPrime)/AFmP;

// Create the variables to be printed (assume to use the MPF values unless there is a good reason not to)
// ----------------------------
var fvfm = fvfm_MPF;
var npqt = npqt_MPF;
var PhiNO = PhiNO_MPF;
var PhiNPQ = PhiNPQ_MPF;
var qL = qL_MPF;
var FmPrime = reg.b;
var qP = qP_MPF;
var FvP_FmP = FvP_FmP_MPF;

/****************OUTPUT VALUES FROM MACRO *******************/

// if any of the flag conditions are true, then create the 'flag' object.  Otherwise, do not create the flag object.
// for now since flag system isn't fully implemented, also create as separate objects so they will be displayed
// ----------------------------

// If multi-phase flash steps are flat or positive slope, then just use the normal Phi2, NPQt, PhiNPQ, PhiNO... etc.
// If Phi2 or NPQt is less than zero, make zero and give user warning.  If Phi2 is higher than .85, give user danger flag.
// ----------------------------
if (reg.m > 0) {
  fvfm = fvfm_noMPF;
  npqt = npqt_noMPF;
  PhiNO = PhiNO_noMPF;
  PhiNPQ = PhiNPQ_noMPF;
  qL = qL_noMPF;
  FmPrime = AFmP;
  qP = qP_noMPF;
  FvP_FmP = FvP_FmP_noMPF;

  if (fvfm <= 0) {
    output["Phi2"] 			= 0;
  //  	output.flag.warning.push("ΦII is negative (should be positive).  It has been set to zero, but check raw trace and consider excluding this point.  To see original negative value, see ΦII variable");
//    output["warning 2"] = "ΦII is negative (should be positive).  It has been set to zero, but check raw trace and consider excluding this point.  To see original negative value, see ΦII variable";
  }
  if (fvfm >=.85) {
//  	output.flag.danger.push("ΦII above the normal range (0 - 0.85).  Please check the raw trace and consider excluding this point.");
//	output["danger 5"] = "ΦII above the normal range (0 - 0.85).  Please check the raw trace and consider excluding this point.";
  }
  else {
	  output["Phi2"] 		= MathROUND(fvfm,3);
  }
  
  if (npqt <= 0) {
//    output["NPQt"] 			= 0;
//  	output.flag.warning.push("NPQt is negative (should be positive)!  It has been set to zero, but check raw trace and consider excluding this point.  To see original negative NPQt value, see NPQt variable");
//	output["warning 1"] = "NPQt is negative (should be positive).  It has been set to zero, but check raw trace and consider excluding this point.  To see original negative value, see NPQt variable";
  }
  else {
	  output['NPQt']		= MathROUND(npqt,3);
  }
	  output['qL']		    = MathROUND(qL,3);
	  output['PhiNPQ']		= MathROUND(PhiNPQ,3);
	  output['PhiNO']		= MathROUND(PhiNO,3);
	  output['FvP/FmP']		= MathROUND(FvP_FmP,3);
	  output['qP']			= MathROUND(qP,3);
}

// Otherwise, use the multi-phase flash calculation for Phi2, NPQt, PhiNPQ, PhiNO... etc.
// If Phi2 or NPQt is less than zero, make zero and give user warning.  If Phi2 is higher than .85, give user danger flag.
// ----------------------------
else {
  if (fvfm <= 0) {
    output["Phi2"] 			= 0;
//  	output.flag.warning.push("ΦII is negative (should be positive).  It has been set to zero, but check raw trace and consider excluding this point.  To see original negative value, see ΦII (MPF) variable");
//	output["warning 2"] = "ΦII is negative (should be positive).  It has been set to zero, but check raw trace and consider excluding this point.  To see original negative value, see ΦII (MPF) variable";
  }
  if (fvfm >=.85) {
//  	output.flag.danger.push("ΦII above the normal range (0 - 0.85).  Please check the raw trace and consider excluding this point.");
//	output["danger 5"] = "ΦII above the normal range (0 - 0.85).  Please check the raw trace and consider excluding this point.";
  }
  else {
  	output["Phi2"] 			= MathROUND(fvfm,3);
  }
  if (npqt <= 0) {
    output["NPQt"] 			= 0;
//  	output.flag.warning.push("NPQt is negative (should be positive)!  It has been set to zero, but check raw trace and consider excluding this point.  To see original negative NPQt value, see NPQt (MPF) variable");
//	output["warning 3"] = "NPQt value is negative (should be positive).  It has been set to zero, but check raw trace and consider excluding this point.  To see original negative value, see NPQt (MPF) variable";
  }
  else {
	  output['NPQt']		= MathROUND(npqt,3);
  }
	  output['qL']		= MathROUND(qL,3);
	  output['PhiNPQ']		= MathROUND(PhiNPQ,3);
	  output['PhiNO']		= MathROUND(PhiNO,3);
	  output['FvP/FmP']		= MathROUND(FvP_FmP,3);
	  output['qP']			= MathROUND(qP,3);
}

// only display LEF if there is a light intensity measurement > 0 
// ----------------------------
if (typeof json.light_intensity != "undefined" && json.light_intensity > 0) {
	output["LEF"] 		= MathROUND((fvfm  * 0.45 * json.light_intensity),3);
}

output["FmPrime"] 		= MathROUND(FmPrime,3);
output["Fs"] 			= MathROUND(Fs,1);
output['FoPrime']		= MathROUND(FoPrime,0);
output["Phi2 (MPF)"] 		= MathROUND(fvfm_MPF,3);
output["Phi2"] 	= MathROUND(fvfm,3);
output['ratio adjusted to regular Phi2'] = MathROUND(fvfm_MPF / fvfm,5);
output['NPQt (MPF)']			= MathROUND(npqt_MPF,3);
output["NPQt"] 	= MathROUND(npqt,3);
output['ratio adjusted to regular NPQt'] = MathROUND(npqt_MPF / npqt,5);
output["FmPrime (MPF)"] 	= MathROUND(reg.b,3);
output["FmPrime"] = MathROUND(AFmP,1);
output['qL (MPF)']		= MathROUND(qL_MPF,3);
output['qL']      = MathROUND(qL,3);
output['PhiNPQ (MPF)']    = MathROUND(PhiNPQ_MPF,3);
output['PhiNPQ']  = MathROUND(PhiNPQ,3);
output['PhiNO (MPF)']		= MathROUND(PhiNO_MPF,3);
output['PhiNO']	= MathROUND(PhiNO,3);



output["MPF_slope"] 	= MathROUND(reg.m,3);
output["MPF_rsquared"] 	= MathROUND(reg.r,3);

output["Fs_std"] 			= MathROUND(Fs_std,1);
output["AFmP_std"] 			= MathROUND(AFmP_std,1);
output["FmP_step1_std"] 	= MathROUND(FmP_step1_std,1);
output["FmP_step2_std"] 	= MathROUND(FmP_step2_std,1);
output["FmP_step3_std"] 	= MathROUND(FmP_step3_std,1);
output["FmP_end_std"] 		= MathROUND(FmP_end_std,1);
output["FoPrime_std"] 			= MathROUND(FoPrime_std,1);


//output["FmP_step1"] = MathROUND(FmP_step1,3);
//output["FmP_step2"] = MathROUND(FmP_step2,3);
//output["FmP_step3"] = MathROUND(FmP_step3,3);
//output["intensity inverse"] = inverse_intensity;
//output["steps"] = [AFmP,FmP_step1,FmP_step2,FmP_step3];
//output["slopey"] = FmP_end/AFmP - AFmP/AFmP ;

if (baseline != 0) {
  output["baseline"] 	= baseline;
}
else {
  output["baseline"] 	= 0;
}

//if (reg.m > 0 | FmP_end/AFmP - AFmP/AFmP > .1 | FmP_end/AFmP - AFmP/AFmP < -.1) {
//}

// Calculate Standard Deviation for Warning or Danger flags (out of bounds measurement)
// ----------------------------

if (Fs_std > 100	) {
//  	output.flag.danger.push("noisy Fs");
//	output["danger 1"] = "noisy Fs";
}
if (AFmP_std > 200) {
//  	output.flag.danger.push("noisy FmPrime");
//	output["danger 2"] = "noisy FmPrime";
}
if (FmP_step1_std > 60 | FmP_step2_std > 60 | FmP_step3_std > 60 | FmP_end_std > 200) {
//  	output.flag.danger.push("noisy multi-phase flash steps");
//	output["danger 3"] = "noisy  multi-phase flash steps";
}
if (FoPrime_std > 150) {
//  	output.flag.danger.push("noisy FoPrime");
//	output["danger 4"] = "noisy FoPrime";
}

if (reg.m > 0) {
//	output.flag.info.push("Used ΦII and not ΦII (MPF) - ambient light level was too low to apply MPF calculation");
//	output["info 1"] = "Used ΦII and not ΦII (MPF) - ambient light level was too low to apply MPF calculation";
}

if (FmP_end/AFmP - AFmP/AFmP > .1) {
//	output.flag.info.push("FmPrime slopes down.  This may mean that saturating flash is not bright enough... consider using a protocol with lower saturating lightf on these samples");
//	output["info 2"] = "FmPrime slopes down. This may mean that saturating flash is not bright enough... consider using a protocol with lower saturating light on these samples";
}

if (FmP_end/AFmP - AFmP/AFmP < -.1) {
//	output.flag.info.push("FmPrime slopes up.  This may mean that saturating flash is too bright... consider using a protocol with higher saturating light on these samples");
//	output["info 3"] = "FmPrime slopes up.  This may mean that saturating flash is too bright... consider using a protocol with higher saturating light on these samples";
}


//----------------------------
// SPAD calculation starts here
//----------------------------


var minolta_spad = 0;
var averages = 0;
var offset = 300

// get sample blank data for each leaf thickness level
var calibration_940_1 = json.get_userdef3[0];
var calibration_940_2 = json.get_userdef4[0];
var calibration_940_3 = json.get_userdef5[0];
var calibration_650_1 = json.get_userdef3[1];
var calibration_650_2 = json.get_userdef4[1];
var calibration_650_3 = json.get_userdef5[1];

// get calibration data to convert to Minolta SPAD for each leaf thickness level
var slope_spad1 = json.get_userdef0[0];
var yint_spad1 = json.get_userdef0[1];
var slope_spad2 = json.get_userdef1[0];
var yint_spad2 = json.get_userdef1[1];
var slope_spad3 = json.get_userdef2[0];
var yint_spad3 = json.get_userdef2[1];

// now get the sample 650 and 940 values averaged
var sample_940_1 = MathMEAN(json.data_raw.slice((offset + 20),(offset + 90)));
var sample_940_2 = MathMEAN(json.data_raw.slice((offset + 220),(offset + 290)));
var sample_940_3 = MathMEAN(json.data_raw.slice((offset + 420),(offset + 490)));
var sample_650_1 = MathMEAN(json.data_raw.slice((offset + 120),(offset + 190)));
var sample_650_2 = MathMEAN(json.data_raw.slice((offset + 320),(offset + 390)));
var sample_650_3 = MathMEAN(json.data_raw.slice((offset + 520),(offset + 590)));

var spad1 = MathLOG((sample_940_1 / calibration_940_1) / (sample_650_1 / calibration_650_1))*100;
var spad2 = MathLOG((sample_940_2 / calibration_940_2) / (sample_650_2 / calibration_650_2))*100;
var spad3 = MathLOG((sample_940_3 / calibration_940_3) / (sample_650_3 / calibration_650_3))*100;
//spad = ((sample_940 / calibration_940) / (sample_650 / calibration_650))*100;

var minolta_spad1 = (spad1-yint_spad1)/slope_spad1;
var minolta_spad2 = (spad2-yint_spad2)/slope_spad2;
var minolta_spad3 = (spad3-yint_spad3)/slope_spad3;

//output ["get"] = MathROUND(spad,2);
//output ["spad"] = MathROUND(spad,2);

//output["calibration values"] = json.get_userdef3;
//output["spad values"] = json.get_userdef0;

// determine the final SPAD to choose
// rules: either values has to be >500

if ((sample_940_1 >500 & sample_940_1 <64000) & (sample_650_1 >500 & sample_650_1 <64000)) {
  minolta_spad = minolta_spad + minolta_spad1;
  averages++;
}
if ((sample_940_2 >500 & sample_940_2 <64000) & (sample_650_2 >500 & sample_650_2 <64000)) {
  minolta_spad = minolta_spad + minolta_spad2;
  averages++;
}
if ((sample_940_3 >500 & sample_940_3 <64000) & (sample_650_3 >500 & sample_650_3 <64000)) {
  minolta_spad = minolta_spad + minolta_spad3;
  averages++;
}

minolta_spad = minolta_spad/averages;  

output ["PQ SPAD"] = MathROUND(minolta_spad,1);
output["averages"] = averages;
output ["PQ SPAD 1"] = MathROUND(minolta_spad1,1);
output ["PQ SPAD 2"] = MathROUND(minolta_spad2,1);
output ["PQ SPAD 3"] = MathROUND(minolta_spad3,1);
//output["raw SPAD 1"] = MathROUND(spad1,2);
//output["raw SPAD 2"] = MathROUND(spad2,2);
//output["raw SPAD 3"] = MathROUND(spad3,2);
//output ["Minolta SPAD"] = Number(json.message[0][2]);
//output ["AtLEAF SPAD"] = Number(json.message[1][2]);
//output ["sample 940"] = MathROUND(sample_940,2);
//output ["cal 940"] = MathROUND(calibration_940,2);
//output ["sample 650"] = MathROUND(sample_650,2);
//output ["cal 650"] = MathROUND(calibration_650,2);
//output ["sample 650"] = MathROUND(sample_650,2);[

//----------------------------
// Now we add the Index of Plant Happiness (IPH) here
//----------------------------
//var iph = (output ["PQ SPAD"] / 100) * ((output["ΦII"] + output['ΦNPQ']) / output['ΦNO'])
//output ["IPH"] = MathROUND(iph,2);
output ["order"] = ["Phi2","PhiNPQ","PhiNO","PQ SPAD","LEF","qL","NPQt","light_intensity"];

return output;
{
  "time": 1516306442863,
  "device_id": 172,
  "firmware_version": "0.450",
  "sample": [
    [
      {
        "time": 1516306442867,
        "protocol_id": 1,
        "get_userdef0": [
          2.999,
          22.799999
        ],
        "get_userdef1": [
          2.823,
          2
        ],
        "get_userdef2": [
          2.861,
          -10.5
        ],
        "get_userdef3": [
          28770,
          53871
        ],
        "get_userdef4": [
          10311,
          39230
        ],
        "get_userdef5": [
          5679,
          40381
        ],
        "get_ir_baseline": [
          [
            15,
            416.14,
            491.24
          ],
          [
            14,
            5817.65,
            6797.16
          ]
        ],
        "get_blank_cal": [
          [
            12,
            28726.17
          ],
          [
            20,
            42455.23
          ]
        ],
        "light_intensity": 9.37,
        "r": 5.51,
        "g": 2.75,
        "b": 1.65,
        "relative_humidity": 13.37,
        "temperature": 26.72,
        "data_raw": [
          6429,
          6536,
          6499,
          6488,
          6413,
          6507,
          6427,
          6505,
          6501,
          6502,
          6485,
          6457,
          6371,
          6417,
          6408,
          6353,
          6504,
          6382,
          6382,
          6473,
          460,
          424,
          449,
          462,
          454,
          435,
          445,
          445,
          457,
          443,
          434,
          433,
          437,
          432,
          449,
          461,
          440,
          463,
          462,
          436,
          440,
          435,
          449,
          451,
          456,
          436,
          453,
          428,
          441,
          448,
          422,
          456,
          434,
          434,
          444,
          442,
          424,
          439,
          428,
          433,
          433,
          438,
          442,
          446,
          441,
          426,
          444,
          440,
          428,
          455,
          450,
          423,
          446,
          432,
          449,
          437,
          449,
          456,
          439,
          445,
          430,
          441,
          412,
          435,
          451,
          425,
          432,
          430,
          452,
          445,
          443,
          426,
          429,
          420,
          419,
          434,
          438,
          430,
          424,
          435,
          418,
          405,
          400,
          399,
          414,
          410,
          402,
          422,
          431,
          432,
          438,
          434,
          427,
          423,
          415,
          417,
          429,
          429,
          424,
          423,
          438,
          413,
          434,
          424,
          413,
          427,
          408,
          435,
          420,
          422,
          426,
          448,
          436,
          411,
          437,
          440,
          439,
          436,
          431,
          403,
          430,
          434,
          407,
          437,
          452,
          445,
          444,
          448,
          434,
          443,
          420,
          450,
          449,
          433,
          425,
          429,
          441,
          415,
          433,
          435,
          431,
          448,
          437,
          435,
          452,
          458,
          431,
          442,
          440,
          437,
          448,
          450,
          443,
          451,
          432,
          436,
          426,
          443,
          450,
          448,
          418,
          427,
          433,
          437,
          439,
          433,
          447,
          435,
          444,
          414,
          418,
          431,
          416,
          416,
          431,
          428,
          417,
          430,
          433,
          423,
          434,
          413,
          421,
          447,
          425,
          429,
          427,
          413,
          428,
          438,
          418,
          426,
          410,
          414,
          420,
          430,
          442,
          421,
          429,
          436,
          442,
          415,
          413,
          425,
          447,
          436,
          432,
          447,
          422,
          423,
          432,
          429,
          425,
          404,
          408,
          426,
          437,
          431,
          443,
          438,
          438,
          429,
          426,
          429,
          428,
          417,
          428,
          431,
          435,
          441,
          422,
          421,
          428,
          413,
          430,
          432,
          421,
          423,
          444,
          435,
          416,
          422,
          407,
          436,
          419,
          414,
          426,
          425,
          417,
          417,
          422,
          428,
          411,
          427,
          438,
          409,
          439,
          435,
          430,
          436,
          432,
          449,
          433,
          436,
          430,
          433,
          413,
          432,
          416,
          443,
          418,
          421,
          419,
          428,
          430,
          428,
          425,
          415,
          426,
          412,
          4910,
          2827,
          2343,
          2321,
          2332,
          2299,
          2332,
          2335,
          2335,
          2348,
          2342,
          2331,
          2321,
          2329,
          2340,
          2321,
          2342,
          2360,
          2320,
          2331,
          2341,
          2331,
          2315,
          2318,
          2334,
          2307,
          2335,
          2325,
          2306,
          2307,
          2321,
          2340,
          2309,
          2321,
          2312,
          2324,
          2332,
          2357,
          2337,
          2332,
          2347,
          2330,
          2324,
          2338,
          2329,
          2339,
          2336,
          2332,
          2331,
          2348,
          2342,
          2334,
          2346,
          2317,
          2340,
          2345,
          2328,
          2329,
          2342,
          2347,
          2341,
          2348,
          2352,
          2345,
          2350,
          2316,
          2342,
          2340,
          2356,
          2341,
          2354,
          2314,
          2339,
          2332,
          2367,
          2336,
          2353,
          2327,
          2307,
          2338,
          2311,
          2320,
          2329,
          2330,
          2347,
          2353,
          2351,
          2345,
          2339,
          2332,
          2322,
          2325,
          2341,
          2365,
          2342,
          2326,
          2337,
          2309,
          2315,
          2315,
          513,
          514,
          513,
          506,
          503,
          508,
          502,
          507,
          507,
          492,
          497,
          506,
          517,
          505,
          516,
          505,
          474,
          471,
          511,
          516,
          507,
          502,
          486,
          486,
          501,
          505,
          495,
          488,
          504,
          504,
          487,
          484,
          502,
          514,
          535,
          499,
          510,
          474,
          498,
          504,
          504,
          506,
          505,
          509,
          500,
          514,
          514,
          486,
          495,
          497,
          507,
          509,
          498,
          487,
          503,
          487,
          500,
          505,
          489,
          505,
          508,
          493,
          506,
          504,
          513,
          521,
          521,
          508,
          510,
          519,
          517,
          508,
          507,
          502,
          504,
          520,
          505,
          508,
          503,
          509,
          496,
          511,
          532,
          510,
          511,
          499,
          490,
          496,
          511,
          494,
          508,
          505,
          508,
          529,
          490,
          519,
          499,
          495,
          502,
          458,
          4187,
          4195,
          4186,
          4181,
          4212,
          4202,
          4179,
          4169,
          4184,
          4190,
          4191,
          4185,
          4180,
          4155,
          4187,
          4180,
          4192,
          4201,
          4186,
          4182,
          4184,
          4182,
          4216,
          4215,
          4220,
          4196,
          4214,
          4184,
          4187,
          4206,
          4194,
          4202,
          4195,
          4196,
          4188,
          4225,
          4181,
          4199,
          4192,
          4167,
          4189,
          4200,
          4204,
          4216,
          4213,
          4213,
          4216,
          4203,
          4196,
          4191,
          4180,
          4177,
          4185,
          4191,
          4174,
          4166,
          4165,
          4174,
          4191,
          4178,
          4179,
          4195,
          4195,
          4190,
          4192,
          4188,
          4189,
          4181,
          4191,
          4174,
          4181,
          4189,
          4182,
          4175,
          4174,
          4197,
          4182,
          4186,
          4189,
          4174,
          4171,
          4172,
          4200,
          4183,
          4186,
          4185,
          4154,
          4171,
          4148,
          4165,
          4176,
          4177,
          4174,
          4163,
          4172,
          4177,
          4203,
          4175,
          4175,
          4179,
          3747,
          3756,
          3713,
          3731,
          3745,
          3742,
          3723,
          3707,
          3731,
          3736,
          3734,
          3750,
          3728,
          3735,
          3738,
          3725,
          3739,
          3739,
          3731,
          3735,
          3730,
          3733,
          3741,
          3745,
          3725,
          3735,
          3729,
          3737,
          3741,
          3733,
          3728,
          3724,
          3713,
          3728,
          3729,
          3726,
          3750,
          3754,
          3726,
          3724,
          3708,
          3716,
          3740,
          3729,
          3709,
          3732,
          3730,
          3751,
          3746,
          3738,
          3733,
          3751,
          3731,
          3746,
          3757,
          3743,
          3741,
          3760,
          3736,
          3720,
          3754,
          3734,
          3739,
          3753,
          3759,
          3737,
          3731,
          3720,
          3740,
          3746,
          3750,
          3732,
          3754,
          3749,
          3742,
          3730,
          3750,
          3758,
          3759,
          3747,
          3737,
          3751,
          3751,
          3741,
          3720,
          3731,
          3732,
          3749,
          3746,
          3730,
          3761,
          3741,
          3745,
          3734,
          3736,
          3742,
          3727,
          3732,
          3731,
          3729,
          6897,
          6888,
          6882,
          6897,
          6878,
          6899,
          6902,
          6929,
          6920,
          6910,
          6901,
          6919,
          6894,
          6924,
          6911,
          6898,
          6926,
          6914,
          6903,
          6901,
          6916,
          6908,
          6915,
          6920,
          6929,
          6904,
          6912,
          6918,
          6914,
          6929,
          6915,
          6913,
          6905,
          6882,
          6906,
          6904,
          6922,
          6908,
          6918,
          6915,
          6900,
          6953,
          6900,
          6894,
          6910,
          6894,
          6894,
          6892,
          6883,
          6890,
          6895,
          6897,
          6892,
          6897,
          6898,
          6929,
          6894,
          6875,
          6890,
          6916,
          6898,
          6903,
          6902,
          6888,
          6901,
          6886,
          6896,
          6883,
          6882,
          6899,
          6919,
          6927,
          6885,
          6881,
          6897,
          6904,
          6915,
          6892,
          6914,
          6895,
          6894,
          6914,
          6916,
          6911,
          6904,
          6912,
          6891,
          6909,
          6917,
          6912,
          6908,
          6901,
          6905,
          6893,
          6887,
          6910,
          6906,
          6906,
          6920,
          6895,
          13449,
          13388,
          13516,
          13455,
          13587,
          13507,
          13448,
          13575,
          13522,
          13490,
          13595,
          13498,
          13492,
          13458,
          13518,
          13453,
          13550,
          13433,
          13473,
          13448,
          13531,
          13452,
          13561,
          13536,
          13474,
          13536,
          13526,
          13543,
          13430,
          13562,
          13570,
          13448,
          13565,
          13561,
          13421,
          13458,
          13533,
          13556,
          13495,
          13422,
          13536,
          13511,
          13421,
          13433,
          13582,
          13510,
          13433,
          13442,
          13476,
          13446,
          13500,
          13538,
          13434,
          13553,
          13424,
          13525,
          13503,
          13529,
          13563,
          13478,
          13450,
          13549,
          13484,
          13470,
          13533,
          13581,
          13554,
          13545,
          13559,
          13560,
          13481,
          13536,
          13382,
          13462,
          13506,
          13449,
          13462,
          13517,
          13497,
          13498,
          13525,
          13486,
          13506,
          13596,
          13559,
          13539,
          13518,
          13435,
          13473,
          13445,
          13472,
          13515,
          13449,
          13573,
          13467,
          13483,
          13502,
          13523,
          13482,
          13502
        ]
      }
    ]
  ],
  "app_os": "win32-10.0.16299",
  "app_name": "PhotosynQ",
  "app_version": "0.0.31",
  "app_device": "ia32",
  "location": [
    "42.7225981",
    "-84.4746674"
  ],
  "time_offset": "America/New_York"
}
Screen shot 2017 05 31 at 12.23.10 pm
Created by

PhotosynQ Admin


Protocol connections:
8
Latest Update:
Jan 2018