Make mode changeable via MQTT and change overheating to enable temp of 25°C regardless the settemp.
This commit is contained in:
Moirtz Wagner 2026-01-05 10:55:51 +01:00
parent bc175426d4
commit e61c283e31
3 changed files with 43 additions and 8 deletions

View File

@ -3,6 +3,7 @@
WiFiUDP MQTT::udp; WiFiUDP MQTT::udp;
const char* MQTT::months[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; const char* MQTT::months[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
bool MQTT::forceStatusUpdate={false};
AsyncWebServer* MQTT::server = new AsyncWebServer(80); AsyncWebServer* MQTT::server = new AsyncWebServer(80);
AsyncWebSocket* MQTT::ws = new AsyncWebSocket("/ws"); AsyncWebSocket* MQTT::ws = new AsyncWebSocket("/ws");
@ -130,14 +131,28 @@ void MQTT::saveConfigToFlash(void){
void MQTT::receiveTopic(char* topic, byte* payload, unsigned int length) { void MQTT::receiveTopic(char* topic, byte* payload, unsigned int length) {
String strTopic = String(topic); String strTopic = String(topic);
if(topic == "weatherStation/tempAmb") if(strTopic.endsWith("/tempAmb")){
glblData.outTemp = String((char*)payload).toFloat(); glblData.outTemp = String((char*)payload,length).toFloat();
}
else if(strTopic.endsWith("/changeSetTemp")){ else if(strTopic.endsWith("/changeSetTemp")){
float newSetTemp = String((char*)payload).toFloat(); float newSetTemp = String((char*)payload,length).toFloat();
if(newSetTemp >= 5.0 && newSetTemp <= 30.0){ if(newSetTemp >= 5.0 && newSetTemp <= 30.0){
glblData.settemp = newSetTemp; glblData.settemp = newSetTemp;
ui_settemp(glblData.settemp); ui_settemp(glblData.settemp);
forceStatusUpdate = true;
remoteLog("MQTT: new SetTemp received: ", newSetTemp);
} }
}else if(strTopic.endsWith("/changeMode")){
String strVal = String((char*)payload,length);
if(strVal.equalsIgnoreCase("overheating")){
glblData.override = OVR_ALWAYSON;
}else if(strVal.equalsIgnoreCase("frost-prevention")){
glblData.override = OVR_ALWAYSOFF;
}else{
glblData.override = OVR_NONE;
}
remoteLog("MQTT: ON mode received", strVal.c_str());
forceStatusUpdate = true;
} }
} }
@ -149,8 +164,10 @@ void MQTT::reconnect(void) {
psclient.subscribe("weatherStation/tempAmb"); psclient.subscribe("weatherStation/tempAmb");
char newtopic[60]; char newtopic[60];
strcpy(newtopic,Settings::prefs.mqtt_topic); strcpy(newtopic,Settings::prefs.mqtt_topic);
strcat(newtopic,"/"); strcat(newtopic,"/changeSetTemp");
strcat(newtopic,"changeSetTemp"); psclient.subscribe(newtopic);
strcpy(newtopic,Settings::prefs.mqtt_topic);
strcat(newtopic,"/changeMode");
psclient.subscribe(newtopic); psclient.subscribe(newtopic);
Serial.println("connected"); Serial.println("connected");
@ -163,6 +180,10 @@ void MQTT::reconnect(void) {
void MQTT::loop(void){ void MQTT::loop(void){
static uint32_t resetCnt = 0; static uint32_t resetCnt = 0;
unsigned long now = millis(); unsigned long now = millis();
if(forceStatusUpdate){
forceStatusUpdate = false;
sendStatus();
}
if(now-lastStatusUpdate > 15000){ //update wifi status every 15secs. if(now-lastStatusUpdate > 15000){ //update wifi status every 15secs.
lastStatusUpdate = now; lastStatusUpdate = now;
if(WiFi.isConnected()){ if(WiFi.isConnected()){
@ -362,6 +383,15 @@ void MQTT::sendStatus(void){
publish_sub("Set Temp[degC]",buffer,true); publish_sub("Set Temp[degC]",buffer,true);
snprintf(buffer, sizeof buffer, "%d", WiFi.RSSI()); snprintf(buffer, sizeof buffer, "%d", WiFi.RSSI());
publish_sub("RSSI [dBm]",buffer,true); publish_sub("RSSI [dBm]",buffer,true);
if(glblData.override == OVR_ALWAYSON){
publish_sub("mode","Overheating",true);
}else if(glblData.override == OVR_ALWAYSOFF){
publish_sub("mode","Frost-prevention",true);
}else if(glblData.override == OVR_NONE){
publish_sub("mode","Normal",true);
}else{
publish_sub("mode","Unknown",true);
}
} }

View File

@ -58,6 +58,7 @@ public:
private: private:
static const char* months[]; static const char* months[];
static bool forceStatusUpdate;
static void serveData(AsyncWebServerRequest *request); static void serveData(AsyncWebServerRequest *request);
//static void serveIndex(AsyncWebServerRequest *request); //static void serveIndex(AsyncWebServerRequest *request);
//static void serveCss(AsyncWebServerRequest *request); //static void serveCss(AsyncWebServerRequest *request);

View File

@ -29,13 +29,17 @@ void ui_settemp(float tmp) {
void update_status(void) { void update_status(void) {
static bool dotState = false; static bool dotState = false;
static unsigned long fullOnTime = millis(); static unsigned long fullOnTime = millis();
override_t mode = glblData.override;
if (glblData.enBuff) { if (glblData.enBuff) {
lv_obj_remove_flag(objects.bufferIcn, LV_OBJ_FLAG_HIDDEN); lv_obj_remove_flag(objects.bufferIcn, LV_OBJ_FLAG_HIDDEN);
} else { } else {
if(mode == OVR_ALWAYSON) {
mode = OVR_NONE; // disable override if buffer is disabled
}
lv_obj_add_flag(objects.bufferIcn, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(objects.bufferIcn, LV_OBJ_FLAG_HIDDEN);
} }
switch (glblData.override) { switch (mode) {
case OVR_NONE: case OVR_NONE:
lv_obj_set_style_text_color(objects.bufferIcn, lv_color_hex(0xFFfafafa), lv_obj_set_style_text_color(objects.bufferIcn, lv_color_hex(0xFFfafafa),
LV_STATE_DEFAULT); LV_STATE_DEFAULT);
@ -48,7 +52,7 @@ void update_status(void) {
case OVR_ALWAYSON: case OVR_ALWAYSON:
lv_obj_set_style_text_color(objects.bufferIcn, lv_color_hex(0xFF00AA00), lv_obj_set_style_text_color(objects.bufferIcn, lv_color_hex(0xFF00AA00),
LV_STATE_DEFAULT); LV_STATE_DEFAULT);
if (glblData.temp < glblData.settemp + 3.0) { // allow for 3degC overheating if (glblData.temp < glblData.settemp + 3.0 || glblData.temp < 25) { // allow for 3degC overheating of up to 25°C regardless of settemp
glblData.heating = true; glblData.heating = true;
} else { } else {
glblData.heating = false; glblData.heating = false;