示例#1
0
void ThingSpeakClass::begin()  //loads settings from json file....
{
	String values = "";

	File f = SPIFFS.open("/cloudgen.json", "r");
	if (!f) {
		DebugPrintln("thingspeak config not found");
	}
	else {  //file exists;
		values = f.readStringUntil('\n');  //read json        		
		f.close();

		DynamicJsonBuffer jsonBuffer;

		JsonObject& root = jsonBuffer.parseObject(values);  //parse weburl
		if (!root.success())
		{
			DebugPrintln("parseObject() thingspeak failed");
			return;
		}
		if (root["spkurl"].asString() != "") { //verify good json info                                                
			thingSpeakURL = root["spkurl"].asString();
			thingWriteKey = root["spkwkey"].asString();
			thingInterval = String(root["spkint"].asString()).toInt();
			TalkBackID = root["tkbid"].asString();
			TalkBackKey = root["tkbkey"].asString();
			talkBackInterval = String(root["tkbint"].asString()).toInt();
			if (String(root["status"].asString()).toInt() == 1) ThingEnabled = true; else ThingEnabled = false;
			if (String(root["tbstatus"].asString()).toInt() == 1) TalkBackEnabled = true; else TalkBackEnabled = false;
			DebugPrintln("ThingSpeak Starting....");
		}
	} //file exists;        
	
}
示例#2
0
void  GlobalsClass::SendHeatGeneralToHM(String fname) {   //sends general info to HM

	String values = "";
	String hmsg;
	File f = SPIFFS.open(fname, "r");	
	if (f) { // we could open the file 
		values = f.readStringUntil('\n');  //read json         
		f.close();
		
		//WRITE CONFIG TO HeaterMeter
		//fBuf(sbuf,"/set?sp=%iF",299);  //format command;
		DynamicJsonBuffer jsonBuffer;

		JsonObject& root = jsonBuffer.parseObject(values);  //parse weburl
		if (!root.success())
		{
			DebugPrintln("parseObject() failed");
			return;
		}
		//const char* sensor    = root["sensor"];
		//long        time      = root["time"];
		//double      latitude  = root["data"][0];
		//double      longitude = root["data"][1];           }

		//set PID                 

		qCon.println(String("/set?pidb=") + root["pidb"].asString()); delay(comdelay);
		qCon.println(String("/set?pidp=") + root["pidp"].asString()); delay(comdelay);
		qCon.println(String("/set?pidi=") + root["pidi"].asString()); delay(comdelay);
		qCon.println(String("/set?pidd=") + root["pidd"].asString()); delay(comdelay);

		//Set Fan info /set?fn=FL,FH,SL,SH,Flags,MSS,FAF,SAC 
		hmsg = String("/set?fn=") + root["minfan"].asString() + "," + root["maxfan"].asString() + "," + root["srvlow"].asString() + "," + root["srvhi"].asString() + "," + root["fanflg"].asString() +
	                        		root["maxstr"].asString() + "," + root["fanflr"].asString() + "," + root["srvcl"].asString();
		qCon.println(hmsg); delay(comdelay);
		DebugPrintln(hmsg);
		//Set Display props       
		hmsg = String("/set?lb=") + root["blrange"].asString() + "," + root["hsmode"].asString() + "," + root["ledcfg"].asString();
		qCon.println(hmsg); delay(comdelay);
		DebugPrintln(hmsg);
		//Set Lid props    
		hmsg = String("/set?ld=") + root["lidoff"].asString() + "," + root["liddur"].asString();
		qCon.println(hmsg); delay(comdelay);
		DebugPrintln(hmsg);
		qCon.println("/set?tt=Web Settings,Updated!!"); delay(comdelay);
		qCon.println("/save?"); delay(comdelay);

	}  //open file success

}
示例#3
0
void ICACHE_FLASH_ATTR ThingSpeakClass::SendThingSpeakValues()
{

	//  if (ThingEnabled) DebugPrintln("thingspeak enabled"); else DebugPrintln("thingspeak disabled");                   
	if (ThingEnabled == false) return;
	if (thingSpeakURL == "") return;
	DebugPrintln(thingSpeakURL);

	if (WiFi.status() != WL_CONNECTED) return;   //check to make sure we are connected...	  

	String postStr = "api_key=" + thingWriteKey;
	if (HMGlobal.hmPitTemp != "U")  postStr += "&field1=" + HMGlobal.hmPitTemp;
	if (HMGlobal.hmFood1 != "U") postStr += "&field2=" + HMGlobal.hmFood1;
	if (HMGlobal.hmFood2 != "U") postStr += "&field3=" + HMGlobal.hmFood2;
	if (HMGlobal.hmAmbient != "U") postStr += "&field4=" + HMGlobal.hmAmbient;
	if (HMGlobal.hmFanMovAvg != "U") postStr += "&field5=" + HMGlobal.hmFanMovAvg;
	if (HMGlobal.hmFan != "U") postStr += "&field6=" + HMGlobal.hmFan;
	if (HMGlobal.hmSetPoint != "U") postStr += "&field7=" + HMGlobal.hmSetPoint;
	if (HMGlobal.hmLidOpenCountdown != "U") postStr += "&field8=" + HMGlobal.hmLidOpenCountdown;

	if (inAlarm)  //if alarm was triggered we send on next msg
	{
		postStr += "&status=" + MyWebServer.urlencode(MyWebServer.CurTimeString() + " " + AlarmInfo);
		AlarmInfo = "";
		inAlarm = false;
	}

		
		HTTPClient http;
		
		DebugPrintln("http://" + thingSpeakURL + "/update");
		http.begin("http://" + thingSpeakURL + "/update");

		int httpCode = http.POST(postStr);

		// httpCode will be negative on error
		if (httpCode > 0) {
			if (httpCode == HTTP_CODE_OK) {				
			}
		}
		else {
			DebugPrintln("[HTTP] POST... failed, error: " + http.errorToString(httpCode));
		}
		http.end();
		
		
	DebugPrintln("sending thingspeak stuffs");

}
示例#4
0
void ICACHE_FLASH_ATTR GlobalsClass::ConfigAlarms(String msgStr)
{   //format is $ALARM,10,20,30,40,50,60,70,80   (lo/hi pairs);  send to comport;
	msgStr.replace("$ALARM,", "");  //remove the alarm command and send rest to HM
	qCon.println("/set?al="+msgStr); delay(comdelay);
	DebugPrintln("setting new alarms " + msgStr);
	qCon.println("/set?tt=Web Alarms,Updated.."); delay(comdelay);
}
示例#5
0
void  GlobalsClass::checkSerialMsg()
{

	String msgStr = qCon.readStringUntil('\n');
	DebugPrintln("received :" + msgStr);		

	if ((getValue(msgStr, 0) == "$HMSU")) //msg is good updatemsg
	{
		if (validatechksum(msgStr) == false) return;
		hmSetPoint = getValue(msgStr, 1); if (hmSetPoint == "U") hmSetPoint = "0";
		hmPitTemp = getValue(msgStr, 2);  if (hmPitTemp == "U") hmPitTemp = "0";
		hmFood1 = getValue(msgStr, 3);   // if (hmFood1 == "U") hmFood1 = "0";
		hmFood2 = getValue(msgStr, 4);   // if (hmFood2 == "U") hmFood2 = "0";
		hmAmbient = getValue(msgStr, 5); // if (hmAmbient == "U") hmAmbient = "0";
		hmFan = getValue(msgStr, 6);     // if (hmFan == "U") hmFan = "0";
		hmFanMovAvg = getValue(msgStr, 7); //if (hmFanMovAvg == "U") hmFanMovAvg = "0";
		hmLidOpenCountdown = getValue(msgStr, 8);//	if (hmLidOpenCountdown == "U") hmLidOpenCountdown = "0";
	}
	else if ((getValue(msgStr, 0) == "$HMAL")) //Alarm is firing....
	{
		if (validatechksum(msgStr) == false) return;
		String AlarmInfo;
		bool HasAlarm;

		AlarmInfo = "Pit Alarm! : ";
		HasAlarm = false;
		int msgpos = 1;
		for (int i = 0; i < 4; i++) {
			String AlarmLo;
			String AlarmHi;
			AlarmLo = getValue(msgStr, msgpos);
			if (AlarmLo.charAt(AlarmLo.length() - 1) == 'L')
			{
				AlarmLo.remove(AlarmLo.length() - 1, 1);
				AlarmInfo += "Probe " + String(i + 1) + " Low:  " + AlarmLo + " ! ";
				HasAlarm = true;
			}
			msgpos += 1;
			AlarmHi = getValue(msgStr, msgpos);
			if (AlarmHi.charAt(AlarmHi.length() - 1) == 'H')
			{
				AlarmHi.remove(AlarmHi.length() - 1, 1);
				AlarmInfo += "Probe " + String(i + 1) + " Hi:  " + AlarmHi + " ! ";
				HasAlarm = true;
			}
			msgpos += 1;
		}  //for each probe, check alarms
		//reset alarms
		if (ResetTimeCheck > 0) { HasAlarm = false; }  //if we're already in alarm countdown, ignore alarm....
		if (HasAlarm)	{
			if (ResetAlarmSeconds > 0) { ResetTimeCheck = millis(); }
			else { ResetTimeCheck = 0; }   //reset alarm in x Seconds.
		MQTTLink.SendAlarm(AlarmInfo);
		ThingSpeak.SendAlarm(AlarmInfo);		
		}		
	}

	
}
示例#6
0
void ICACHE_FLASH_ATTR ThingSpeakClass::SendAlarm(String AlarmMsg)
{
	if (ThingEnabled == false) return;
	if (thingSpeakURL == "") return;
	inAlarm = true;  //next message send we will send alarm info.
	AlarmInfo = AlarmMsg;
	DebugPrintln(thingSpeakURL);	
}
示例#7
0
void GlobalsClass::SendProbesToHM(String fname) {   //sends Probes info to HM
	String values = "";
	String hmsg;
	File f = SPIFFS.open(fname, "r");
	if (f) { // we could open the file 
		values = f.readStringUntil('\n');  //read json         
		f.close();

		//WRITE CONFIG TO HeaterMeter

		DynamicJsonBuffer jsonBuffer;

		JsonObject& root = jsonBuffer.parseObject(values);  //parse json data
		if (!root.success())
		{
			DebugPrintln("parseObject() failed");
			return;
		}
		//const char* sensor    = root["sensor"];
		//long        time      = root["time"];
		//double      latitude  = root["data"][0];
		//double      longitude = root["data"][1];           }

		qCon.println(String("/set?pn0=") + root["p0name"].asString()); delay(comdelay);
		qCon.println(String("/set?pn1=") + root["p1name"].asString()); delay(comdelay);
		qCon.println(String("/set?pn2=") + root["p2name"].asString()); delay(comdelay);
		qCon.println(String("/set?pn3=") + root["p3name"].asString()); delay(comdelay);

		//Set offsets
		hmsg = String("/set?po=") + root["p0off"].asString() + "," + root["p1off"].asString() + "," + root["p2off"].asString() + "," + root["p3off"].asString();
		qCon.println(hmsg); delay(comdelay);
		DebugPrintln(hmsg);



		//Set Probe coeff.
		hmsg = String("/set?pc0=") + root["p0a"].asString() + "," + root["p0b"].asString() + "," + root["p0c"].asString() + "," + root["p0r"].asString() + "," + root["p0trm"].asString();
		qCon.println(hmsg); delay(comdelay);
		DebugPrintln(hmsg);
		hmsg = String("/set?pc1=") + root["p1a"].asString() + "," + root["p1b"].asString() + "," + root["p1c"].asString() + "," + root["p1r"].asString() + "," + root["p1trm"].asString();
		qCon.println(hmsg); delay(comdelay);
		DebugPrintln(hmsg);
		hmsg = String("/set?pc2=") + root["p2a"].asString() + "," + root["p2b"].asString() + "," + root["p2c"].asString() + "," + root["p2r"].asString() + "," + root["p2trm"].asString();
		qCon.println(hmsg); delay(comdelay);
		DebugPrintln(hmsg);
		hmsg = String("/set?pc3=") + root["p3a"].asString() + "," + root["p3b"].asString() + "," + root["p3c"].asString() + "," + root["p3r"].asString() + "," + root["p3trm"].asString();
		qCon.println(hmsg); delay(comdelay);
		DebugPrintln(hmsg);

		//Set Alarm offsets
		hmsg = String("/set?al=") + root["p0all"].asString() + "," + root["p0alh"].asString() + "," + root["p1all"].asString() + "," + root["p1alh"].asString() + "," + root["p2all"].asString() + "," + root["p2alh"].asString() + "," + root["p3all"].asString() + "," + root["p3alh"].asString();
		qCon.println(hmsg); delay(comdelay);
		DebugPrintln(hmsg);
		qCon.println("/set?tt=Web Settings,Updated!!"); delay(comdelay);
		qCon.println("/save?"); delay(comdelay);

	}  //open file success

}
示例#8
0
String ICACHE_FLASH_ATTR ThingSpeakClass::getThingSpeak(String talkBackID, String talkApiKey)   //talkback message processing
{  //TalkBack Function from thingspeak
	String pageLength;
	String CommandString = "";
	String HTMLResult;
	bool GoodResult = false;

	DebugPrintln("talkback checking...");
	if (TalkBackEnabled == false) return "";
	if (thingSpeakURL == "") return "";
	

	if (WiFi.status() != WL_CONNECTED) return "";   //check to make sure we are connected...

	String url = "/talkbacks/" + talkBackID + "/commands/execute?api_key=" + talkApiKey;
	
	HTTPClient http;	

	http.begin("http://"+ thingSpeakURL + url);

	int httpCode = http.GET();

	// httpCode will be negative on error
	if (httpCode > 0) {
		// HTTP header has been send and Server response header has been handled
		//DebugPrintln("[HTTP] GET... code: " + String(httpCode));
		// file found at server
		if (httpCode == HTTP_CODE_OK) {
			CommandString  = http.getString();			
		}
	}
	else {
		DebugPrintln("[HTTP] GET... failed, error: " + http.errorToString(httpCode));
	}   
	http.end();

	
	
	CommandString.replace("\n", "");
	if (CommandString!="") DebugPrintln("Got talkback result : " + CommandString);
	return CommandString;
	
}
示例#9
0
void ICACHE_FLASH_ATTR GlobalsClass::SetTemp(int sndTemp)   //send temperature to HM via serial....
{	
	if (sndTemp>0)
		{
			qCon.println(String("/set?sp=") + String(sndTemp));
			qCon.println(String("/set?tt=Remote Temp,Set to ") + String(sndTemp));
			DebugPrintln(String("Setting Remote Temp ") + String(sndTemp));
			hmSetPoint = String(sndTemp);
		}
	
}
示例#10
0
void ICACHE_FLASH_ATTR FlashHM() {  //server request to flash avr file to HM...file exists on spiffs	
	if (!MyWebServer.isAuthorized()) return;

	String fname = "";	
	if (server.hasArg("fname")) { fname=server.arg("fname"); }

	if (fname == "") return server.send(200, "text/html", "Flashing File NOT FOUND");;
	DebugPrintln("FLashing :" + server.arg("fname"));
	MyWebServer.OTAisflashing = true;	
	//delay(200);
#ifdef SoftSerial
	qCon.enableRx(true);
#endif
	qCon.flush();	
//	delay(10);
	qCon.begin(115200);  //HM speed for flashing with optiboot	
	Esp8266AVRFlash.FlashAVR(&qCon, "/"+fname);  //flashAVR HM
	qCon.flush();  	
	server.send(200, "text/html", "Flashing AVR....please wait...will auto-reboot...do NOT touch system!!!");
	delay(2000);
	ESP.restart(); //restart ESP after reboot.....
}
示例#11
0
boolean validatechksum(String msg)
{  //NMEA 0183 format
	
	String tstmsg = msg.substring(1, msg.length() - 3);
	String inCHK = msg.substring(msg.length() - 2, msg.length());
	char cs='\0'; //chksum

	if (msg.charAt(msg.length() - 3) != '*') { return false; }
	
	
	for (int fx = 0; fx < tstmsg.length(); fx++)
	{
		cs ^= tstmsg.charAt(fx);
	}	
	if (cs == (int)strtol(inCHK.c_str(), NULL, 16)) {
		return true;
	}
	else { 
	DebugPrintln("*** Serial MSG CHKSUM FAILED ***");
	MyWebServer.ServerLog("CF:CHKSUM Failed" );
	return false;
	}
}
void ProcessInput(ADKAccessory &acc, byte *inMsg, int len)
{
  int pin, mode, value;
  int shield_id;
  int command;
  long d;

  CommandPacket pktRead(inMsg, len);

  shield_id = pktRead.readInt(); // shield id for response
  command = pktRead.readInt();
  switch(command) {
  case COMMAND_PIN_MODE :
      pin = pktRead.readByte();
      mode = pktRead.readByte();
      DebugPrintln("ProcessInput: Pinmode ");
      DebugPrintln("pin = ");
      DebugPrintln(pin);
      DebugPrintln(" mode = ");
      DebugPrintln(mode);
      pinMode(pin, mode);
      break;

  case COMMAND_DIGITAL_READ:
      pin = pktRead.readByte();
      value = digitalRead(pin);
      // send data to mobile
      DebugPrintln("ProcessInput: DigitalRead ");
      DebugPrintln("pin = ");
      DebugPrintln(pin);
      DebugPrintln(" value = ");
      DebugPrintln(value);
      SendReplyInt(acc, shield_id, REPLY_OK, value);
      break;

  case COMMAND_DIGITAL_WRITE:
      pin = pktRead.readByte();
      value = pktRead.readByte();
      digitalWrite(pin, value);
      DebugPrintln("ProcessInput: DigitalWrite ");
      DebugPrintln("pin = ");
      DebugPrintln(pin);
      DebugPrintln(" value = ");
      DebugPrintln(value);
      break;

  case COMMAND_ANALOG_READ:
       pin = pktRead.readByte();
       value = analogRead(pin);
       // send data to mobile
       DebugPrintln("ProcessInput: AnalogRead ");
       DebugPrintln("pin = ");
       DebugPrintln(pin);
       DebugPrintln(" value = ");
       DebugPrintln(value);
       // 0~1023
       SendReplyInt(acc, shield_id, REPLY_OK, value);
       break;

  case COMMAND_ANALOG_WRITE:
       pin = pktRead.readByte();
       value = pktRead.readByte(); // 0~255
       DebugPrintln("ProcessInput: AnalogWrite ");
       DebugPrintln("pin = ");
       DebugPrintln(pin);
       DebugPrintln(" value = ");
       DebugPrintln(value);
       analogWrite(pin, value);
       break;

  case COMMAND_DELAY:
       d = pktRead.readLong();
       DebugPrintln("ProcessInput: Delay ");
       DebugPrintln(" value = ");
       DebugPrintln(d); 
       delay(d);
       break;

  case COMMAND_DELAYMICROS:
       value = pktRead.readInt();
       DebugPrintln("ProcessInput: DelayMicroseconds ");
       DebugPrintln(" value = ");
       DebugPrintln(value); 
       delayMicroseconds(value);
       break;

  case COMMAND_MILLIS:
       DebugPrintln("ProcessInput: Millis ");
       d = millis();
       SendReplyLong(acc, shield_id, REPLY_OK, d);
       break;

  case COMMAND_MICROS:
       DebugPrintln("ProcessInput: Micros ");
       d = micros();
       SendReplyLong(acc, shield_id, REPLY_OK, d);
       break;

  case COMMAND_USER:
       DebugPrintln("ProcessInput: User Command command id = ");
       DebugPrintln(command);
       ProcessUserCommand(pktRead, acc, shield_id);
       break;

  default:
       DebugPrintln("ProcessInput: Unknown command:");
       DebugPrintln(command);
       break;
  }
}