diff --git a/Raumtermostat/src/MQTT.cpp b/Raumtermostat/src/MQTT.cpp index 3edf1bd..5fd9a8d 100644 --- a/Raumtermostat/src/MQTT.cpp +++ b/Raumtermostat/src/MQTT.cpp @@ -3,6 +3,7 @@ WiFiUDP MQTT::udp; 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); AsyncWebSocket* MQTT::ws = new AsyncWebSocket("/ws"); @@ -130,14 +131,28 @@ void MQTT::saveConfigToFlash(void){ void MQTT::receiveTopic(char* topic, byte* payload, unsigned int length) { String strTopic = String(topic); - if(topic == "weatherStation/tempAmb") - glblData.outTemp = String((char*)payload).toFloat(); + if(strTopic.endsWith("/tempAmb")){ + glblData.outTemp = String((char*)payload,length).toFloat(); + } 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){ glblData.settemp = newSetTemp; 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"); char newtopic[60]; 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); Serial.println("connected"); @@ -163,6 +180,10 @@ void MQTT::reconnect(void) { void MQTT::loop(void){ static uint32_t resetCnt = 0; unsigned long now = millis(); + if(forceStatusUpdate){ + forceStatusUpdate = false; + sendStatus(); + } if(now-lastStatusUpdate > 15000){ //update wifi status every 15secs. lastStatusUpdate = now; if(WiFi.isConnected()){ @@ -362,6 +383,15 @@ void MQTT::sendStatus(void){ publish_sub("Set Temp[degC]",buffer,true); snprintf(buffer, sizeof buffer, "%d", WiFi.RSSI()); 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); + } } diff --git a/Raumtermostat/src/MQTT.h b/Raumtermostat/src/MQTT.h index 62d80d6..7746942 100644 --- a/Raumtermostat/src/MQTT.h +++ b/Raumtermostat/src/MQTT.h @@ -58,6 +58,7 @@ public: private: static const char* months[]; + static bool forceStatusUpdate; static void serveData(AsyncWebServerRequest *request); //static void serveIndex(AsyncWebServerRequest *request); //static void serveCss(AsyncWebServerRequest *request); diff --git a/Raumtermostat/src/ui/actions.cpp b/Raumtermostat/src/ui/actions.cpp index f79ca30..abbcc6f 100644 --- a/Raumtermostat/src/ui/actions.cpp +++ b/Raumtermostat/src/ui/actions.cpp @@ -29,13 +29,17 @@ void ui_settemp(float tmp) { void update_status(void) { static bool dotState = false; static unsigned long fullOnTime = millis(); + override_t mode = glblData.override; if (glblData.enBuff) { lv_obj_remove_flag(objects.bufferIcn, LV_OBJ_FLAG_HIDDEN); } else { + if(mode == OVR_ALWAYSON) { + mode = OVR_NONE; // disable override if buffer is disabled + } lv_obj_add_flag(objects.bufferIcn, LV_OBJ_FLAG_HIDDEN); } - - switch (glblData.override) { + + switch (mode) { case OVR_NONE: lv_obj_set_style_text_color(objects.bufferIcn, lv_color_hex(0xFFfafafa), LV_STATE_DEFAULT); @@ -48,7 +52,7 @@ void update_status(void) { case OVR_ALWAYSON: lv_obj_set_style_text_color(objects.bufferIcn, lv_color_hex(0xFF00AA00), 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; } else { glblData.heating = false;