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:
parent
87b1704335
commit
8b8aaf0024
|
@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue