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; }
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 }
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"); }
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); }
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); } } }
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); }
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 }
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; }
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); } }
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..... }
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; } }