Timer Temperature support added

Desired temperature requests are now managed via TimerManager to allow timer override of desired temperature.
Bug fix: crash checking for new firmware if no STA connection
Suppression of GPIO JSON if no or limited GPIO capability is installed.
This commit is contained in:
Ray Jones 2020-03-29 13:59:13 +11:00
parent 87b1704335
commit 8b8aaf0024
6 changed files with 104 additions and 41 deletions

View file

@ -396,12 +396,17 @@ void
esp32FOTA::execAsyncHTTPcheck() esp32FOTA::execAsyncHTTPcheck()
{ {
_newVersion = 0; _newVersion = 0;
if(_versionTest.readyState() == 0 || _versionTest.readyState() == 4) { if ((WiFi.status() == WL_CONNECTED)) {
Serial.println("Querying firmware update server"); if(_versionTest.readyState() == 0 || _versionTest.readyState() == 4) {
_versionTest.onReadyStateChange(FOTA_PollCallback, this); Serial.println("Querying firmware update server");
_versionTest.onBuildHeaders(NULL); _versionTest.onReadyStateChange(FOTA_PollCallback, this);
_versionTest.onData(NULL); _versionTest.onBuildHeaders(NULL);
_versionTest.open("GET", _checkURL.c_str()); _versionTest.onData(NULL);
_versionTest.open("GET", _checkURL.c_str());
}
}
else {
Serial.println("Firmware update check skipped = no STA");
} }
} }

View file

@ -117,6 +117,7 @@
#include <nvs.h> #include <nvs.h>
#include "Utility/MQTTsetup.h" #include "Utility/MQTTsetup.h"
#include <FreeRTOS.h> #include <FreeRTOS.h>
#include "RTC/TimerManager.h"
// SSID & password now stored in NV storage - these are still the default values. // SSID & password now stored in NV storage - these are still the default values.
//#define AP_SSID "Afterburner" //#define AP_SSID "Afterburner"
@ -1128,7 +1129,8 @@ bool reqDemand(uint8_t newDemand, bool save)
// set and save the demand to NV storage // set and save the demand to NV storage
// note that we now maintain fixed Hz and Thermostat set points seperately // note that we now maintain fixed Hz and Thermostat set points seperately
if(getThermostatModeActive()) { if(getThermostatModeActive()) {
RTC_Store.setDesiredTemp(newDemand); // RTC_Store.setDesiredTemp(newDemand);
CTimerManager::setWorkingTemperature(newDemand);
} }
else { else {
RTC_Store.setDesiredPump(newDemand); RTC_Store.setDesiredPump(newDemand);
@ -1142,7 +1144,8 @@ bool reqDemandDelta(int delta)
{ {
uint8_t newDemand; uint8_t newDemand;
if(getThermostatModeActive()) { if(getThermostatModeActive()) {
newDemand = RTC_Store.getDesiredTemp() + delta; // newDemand = RTC_Store.getDesiredTemp() + delta;
newDemand = CTimerManager::getWorkingTemperature() + delta;
} }
else { else {
newDemand = RTC_Store.getDesiredPump() + delta; newDemand = RTC_Store.getDesiredPump() + delta;
@ -1247,7 +1250,8 @@ void forceBootInit()
uint8_t getDemandDegC() uint8_t getDemandDegC()
{ {
return RTC_Store.getDesiredTemp(); return CTimerManager::getWorkingTemperature();
// return RTC_Store.getDesiredTemp();
} }
void setDemandDegC(uint8_t val) void setDemandDegC(uint8_t val)
@ -1255,7 +1259,8 @@ void setDemandDegC(uint8_t val)
uint8_t max = DefaultBTCParams.getTemperature_Max(); uint8_t max = DefaultBTCParams.getTemperature_Max();
uint8_t min = DefaultBTCParams.getTemperature_Min(); uint8_t min = DefaultBTCParams.getTemperature_Min();
BOUNDSLIMIT(val, min, max); BOUNDSLIMIT(val, min, max);
RTC_Store.setDesiredTemp(val); // RTC_Store.setDesiredTemp(val);
CTimerManager::setWorkingTemperature(val);
} }
uint8_t getDemandPump() uint8_t getDemandPump()
@ -1271,7 +1276,8 @@ float getTemperatureDesired()
} }
else { else {
if(getThermostatModeActive()) if(getThermostatModeActive())
return RTC_Store.getDesiredTemp(); // return RTC_Store.getDesiredTemp();
return CTimerManager::getWorkingTemperature();
else else
return RTC_Store.getDesiredPump(); return RTC_Store.getDesiredPump();
} }

View file

@ -83,7 +83,7 @@ CSetTimerScreen::show()
else { else {
// start // start
xPos = 18; xPos = 18;
yPos = 18; yPos = 16;
_printMenuText(xPos, yPos, "On", false, eRightJustify); _printMenuText(xPos, yPos, "On", false, eRightJustify);
_printMenuText(xPos+17, yPos, ":"); _printMenuText(xPos+17, yPos, ":");
xPos += 6; xPos += 6;
@ -95,7 +95,7 @@ CSetTimerScreen::show()
// stop // stop
xPos = 82; xPos = 82;
yPos = 18; yPos = 16;
_printMenuText(xPos, yPos, "Off", false, eRightJustify); _printMenuText(xPos, yPos, "Off", false, eRightJustify);
_printMenuText(xPos+17, yPos, ":"); _printMenuText(xPos+17, yPos, ":");
xPos += 6; xPos += 6;
@ -110,13 +110,26 @@ CSetTimerScreen::show()
_printEnabledTimers(); _printEnabledTimers();
xPos = _display.width() - border; xPos = _display.width() - border;
yPos = 35; yPos = 28;
if(_timerInfo.repeat) if(_timerInfo.repeat)
msg = "Repeat"; msg = "Repeat";
else else
msg = "Once"; msg = "Once";
_printMenuText(xPos, yPos, msg, _rowSel==1 && _colSel==5, eRightJustify); _printMenuText(xPos, yPos, msg, _rowSel==1 && _colSel==5, eRightJustify);
xPos = 18;
yPos = 40;
float fTemp = _timerInfo.temperature;
if(NVstore.getUserSettings().degF) {
fTemp = fTemp * 9 / 5 + 32;
sprintf(str, "%.0f`F", fTemp);
}
else {
sprintf(str, "%.0f`C", fTemp);
}
_printMenuText(_display.xCentre(), yPos, str, _rowSel==1 && _colSel==6, eCentreJustify);
// navigation line // navigation line
yPos = 53; yPos = 53;
xPos = _display.xCentre(); xPos = _display.xCentre();
@ -160,7 +173,7 @@ CSetTimerScreen::keyHandler(uint8_t event)
case 1: case 1:
// select previous field // select previous field
_colSel--; _colSel--;
WRAPLOWERLIMIT(_colSel, 0, 5); WRAPLOWERLIMIT(_colSel, 0, 6);
break; break;
case 2: case 2:
// select previous day // select previous day
@ -178,7 +191,7 @@ CSetTimerScreen::keyHandler(uint8_t event)
case 1: case 1:
// select next field // select next field
_colSel++; _colSel++;
WRAPUPPERLIMIT(_colSel, 5, 0); WRAPUPPERLIMIT(_colSel, 6, 0);
break; break;
case 2: case 2:
// select next day // select next day
@ -335,6 +348,10 @@ CSetTimerScreen::_adjust(int dir)
case 5: case 5:
_timerInfo.repeat = !_timerInfo.repeat; _timerInfo.repeat = !_timerInfo.repeat;
break; break;
case 6:
_timerInfo.temperature += dir;
BOUNDSLIMIT(_timerInfo.temperature, 8, 35);
break;
} }
} }
@ -343,7 +360,7 @@ CSetTimerScreen::_printEnabledTimers()
{ {
const int dayWidth = 10; const int dayWidth = 10;
int xPos = border; int xPos = border;
int yPos = 35; int yPos = 28;
if(_timerInfo.enabled == 0x00 && _rowSel != 2) { if(_timerInfo.enabled == 0x00 && _rowSel != 2) {
_printMenuText(xPos, yPos, "Disabled", _colSel==4); _printMenuText(xPos, yPos, "Disabled", _colSel==4);

View file

@ -44,6 +44,7 @@ int CTimerManager::_activeTimer = 0;
int CTimerManager::_activeDow = 0; int CTimerManager::_activeDow = 0;
int CTimerManager::_nextTimer = 0; int CTimerManager::_nextTimer = 0;
int CTimerManager::_nextStart = 0; int CTimerManager::_nextStart = 0;
uint8_t CTimerManager::_workingTemperature = 22;
bool CTimerManager::_timerChanged = false; bool CTimerManager::_timerChanged = false;
#define SET_MAPS() { \ #define SET_MAPS() { \
@ -265,17 +266,23 @@ CTimerManager::manageTime(int _hour, int _minute, int _dow)
} }
if(newID) { if(newID) {
DebugPort.println("Start of timer interval, starting heater"); sTimer timer;
// get timer settings
int ID = (newID & 0xf) - 1;
NVstore.getTimerInfo(ID, timer);
_workingTemperature = timer.temperature;
DebugPort.printf("Start of timer interval, starting heater @ %dC\r\n", _workingTemperature);
requestOn(); requestOn();
_activeDow = dow; // dow when timer interval start was detected _activeDow = dow; // dow when timer interval start was detected
retval = 1; retval = 1;
} }
else { else {
DebugPort.println("End of timer interval, stopping heater");
// if(!RTC_Store.getFrostOn() && !RTC_Store.getCyclicEngaged()) // if(!RTC_Store.getFrostOn() && !RTC_Store.getCyclicEngaged())
if(!RTC_Store.getFrostOn()) if(!RTC_Store.getFrostOn())
requestOff(); requestOff();
retval = 2; retval = 2;
_workingTemperature = RTC_Store.getDesiredTemp();
DebugPort.printf("End of timer interval, stopping heater & %dC\r\n", _workingTemperature);
} }
_activeTimer = newID; _activeTimer = newID;
} }
@ -414,3 +421,22 @@ CTimerManager::createOneShotMap(sTimer& timer, uint16_t* pTimerMap, uint16_t* pT
return false; return false;
} }
// Concept of timer working temperature is that when a timer runs, it installs
// the programmed temeprature for that timer as the new set point.
// When the timer stops, it reverts to the usual user set temperature.
//
// BUT, if a timer is running, the working temperature is updated with the new demand
// and the user temperature is also changed accordingly.
// The programmed timer temeprature is not altered and wil lrecur in the future when that time runs.
uint8_t
CTimerManager::getWorkingTemperature()
{
return _workingTemperature;
}
void
CTimerManager::setWorkingTemperature(uint8_t newDegC)
{
_workingTemperature = newDegC;
RTC_Store.setDesiredTemp(newDegC);
}

View file

@ -52,7 +52,10 @@ public:
static void getTimer(int idx, sTimer& timerInfo); static void getTimer(int idx, sTimer& timerInfo);
static int setTimer(sTimer& timerInfo); static int setTimer(sTimer& timerInfo);
static bool hasTimerChanged() { return _timerChanged; }; static bool hasTimerChanged() { return _timerChanged; };
static uint8_t getWorkingTemperature();
static void setWorkingTemperature(uint8_t newDegC);
private: private:
static uint8_t _workingTemperature;
static int _activeTimer; static int _activeTimer;
static int _activeDow; static int _activeDow;
static int _prevState; static int _prevState;

View file

@ -37,6 +37,7 @@
#include <string.h> #include <string.h>
#include "HourMeter.h" #include "HourMeter.h"
#include "TempSense.h" #include "TempSense.h"
#include "BoardDetect.h"
extern CModerator MQTTmoderator; extern CModerator MQTTmoderator;
@ -285,30 +286,35 @@ bool makeJSONStringGPIO(CModerator& moderator, char* opStr, int len)
bool bSend = false; // reset should send flag bool bSend = false; // reset should send flag
sGPIO info; if(getBoardRevision() != 0 && getBoardRevision() != BRD_V2_NOGPIO) { // has GPIO support
getGPIOinfo(info);
bSend |= moderator.addJson("GPin1", info.inState[0], root); sGPIO info;
bSend |= moderator.addJson("GPin2", info.inState[1], root); getGPIOinfo(info);
bSend |= moderator.addJson("GPout1", info.outState[0], root);
bSend |= moderator.addJson("GPout2", info.outState[1], root);
bSend |= moderator.addJson("GPanlg", info.algVal * 100 / 4096, root);
bSend |= moderator.addJson("GPmodeIn1", GPIOin1Names[info.in1Mode], root);
bSend |= moderator.addJson("GPmodeIn2", GPIOin2Names[info.in2Mode], root);
bSend |= moderator.addJson("GPmodeOut1", GPIOout1Names[info.out1Mode], root);
bSend |= moderator.addJson("GPmodeOut2", GPIOout2Names[info.out2Mode], root);
bSend |= moderator.addJson("GPoutThr1", NVstore.getUserSettings().GPIO.thresh[0], root);
bSend |= moderator.addJson("GPoutThr2", NVstore.getUserSettings().GPIO.thresh[1], root);
bSend |= moderator.addJson("GPmodeAnlg", GPIOalgNames[info.algMode], root);
bSend |= moderator.addJson("ExtThermoTmout", (uint32_t)NVstore.getUserSettings().ExtThermoTimeout, root);
const char* stop = getExternalThermostatHoldTime();
if(stop)
bSend |= moderator.addJson("ExtThermoStop", stop, root);
else
bSend |= moderator.addJson("ExtThermoStop", "Off", root);
if(bSend) { bSend |= moderator.addJson("GPin1", info.inState[0], root);
root.printTo(opStr, len); bSend |= moderator.addJson("GPin2", info.inState[1], root);
bSend |= moderator.addJson("GPout1", info.outState[0], root);
bSend |= moderator.addJson("GPout2", info.outState[1], root);
bSend |= moderator.addJson("GPmodeIn1", GPIOin1Names[info.in1Mode], root);
bSend |= moderator.addJson("GPmodeIn2", GPIOin2Names[info.in2Mode], root);
bSend |= moderator.addJson("GPmodeOut1", GPIOout1Names[info.out1Mode], root);
bSend |= moderator.addJson("GPmodeOut2", GPIOout2Names[info.out2Mode], root);
bSend |= moderator.addJson("GPoutThr1", NVstore.getUserSettings().GPIO.thresh[0], root);
bSend |= moderator.addJson("GPoutThr2", NVstore.getUserSettings().GPIO.thresh[1], root);
if(getBoardRevision() != BRD_V2_GPIO_NOALG && getBoardRevision() != BRD_V3_GPIO_NOALG) { // has GPIO support
bSend |= moderator.addJson("GPanlg", info.algVal * 100 / 4096, root);
bSend |= moderator.addJson("GPmodeAnlg", GPIOalgNames[info.algMode], root);
}
bSend |= moderator.addJson("ExtThermoTmout", (uint32_t)NVstore.getUserSettings().ExtThermoTimeout, root);
const char* stop = getExternalThermostatHoldTime();
if(stop)
bSend |= moderator.addJson("ExtThermoStop", stop, root);
else
bSend |= moderator.addJson("ExtThermoStop", "Off", root);
if(bSend) {
root.printTo(opStr, len);
}
} }
return bSend; return bSend;