float setTemp_lastPublished; float currSetTemp_lastPublished; int heatingMode_lastPublished; int preset_lastPublished; bool turnHeatingOn_lastPublished; void publishCurrentThermostatValues(bool force = false) { // most values are only published if changed // call publishCurrentThermostatValues(true); to force publishing an update char tmp_topic_out[50]; char ch_valuebuf[7]; updateCurrentHeatingModeName(); updateCurrentPresetName(); char logBuf[101]; sprintf_P(logBuf, "%s: %s=%u, %s=%u, %s=%2.1f, %s=%2.1f", PGMStr_thermostat, PGMStr_heatingMode, heatingMode, PGMStr_preset, preset, PGMStr_setTemp, setTemp, PGMStr_currentSetTemp, currSetTemp); sendLog(logBuf, LOGLEVEL_INFO); if (force || !confBas.saveToMqttRetained || setTemp != setTemp_lastPublished) { sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "setTemp"); sprintf(ch_valuebuf, "%2.1f", setTemp); mqttclient.publish(tmp_topic_out, ch_valuebuf, confMqtt.mqtt_outRetain); if (confBas.saveToMqttRetained && setTemp != setTemp_lastPublished) { // MQTT retained save setTemp mqttclient.publish(mqtt_topic_in_setTemp, ch_valuebuf, true); char buf1[30]; sprintf_P(buf1, "%s %s %2.1f", PGMStr_mqttRetainedSave, PGMStr_setTemp, setTemp); sendLog(buf1); } setTemp_lastPublished = setTemp; yield(); } if (force || currSetTemp != currSetTemp_lastPublished || !confMqtt.mqtt_outRetain) { sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "currSetTemp"); sprintf(ch_valuebuf, "%2.1f", currSetTemp); mqttclient.publish(tmp_topic_out, ch_valuebuf, confMqtt.mqtt_outRetain); currSetTemp_lastPublished = currSetTemp; yield(); } if (force || !confBas.saveToMqttRetained || heatingMode != heatingMode_lastPublished) { sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "mode"); char ch_heatingMode[3]; sprintf(ch_heatingMode, "%d", heatingMode); mqttclient.publish(tmp_topic_out, ch_heatingMode, confMqtt.mqtt_outRetain); sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "modeName"); mqttclient.publish(tmp_topic_out, currentModeName, confMqtt.mqtt_outRetain); sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "modeHA"); if(heatingMode == 0) mqttclient.publish(tmp_topic_out, "off", confMqtt.mqtt_outRetain); else if(heatingMode == 1) mqttclient.publish(tmp_topic_out, "heat", confMqtt.mqtt_outRetain); if (confBas.saveToMqttRetained && heatingMode != heatingMode_lastPublished) { // MQTT retained save setMode mqttclient.publish(mqtt_topic_in_setMode, ch_heatingMode, true); char buf1[30]; sprintf_P(buf1, "%s %s %u", PGMStr_mqttRetainedSave, PGMStr_heatingMode, heatingMode); sendLog(buf1); } heatingMode_lastPublished = heatingMode; yield(); } if (force || !confBas.saveToMqttRetained || preset != preset_lastPublished) { sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "preset"); char ch_preset[3]; sprintf(ch_preset, "%d", preset); mqttclient.publish(tmp_topic_out, ch_preset, confMqtt.mqtt_outRetain); sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "presetName"); mqttclient.publish(tmp_topic_out, currentPresetName, confMqtt.mqtt_outRetain); sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "presetHA"); if (preset == 0) mqttclient.publish(tmp_topic_out, "norm", confMqtt.mqtt_outRetain); else if (preset == 1) mqttclient.publish(tmp_topic_out, "red1", confMqtt.mqtt_outRetain); else if (preset == 2) mqttclient.publish(tmp_topic_out, "red2", confMqtt.mqtt_outRetain); if (confBas.saveToMqttRetained && preset != preset_lastPublished) { // MQTT retained save setPreset mqttclient.publish(mqtt_topic_in_setPreset, ch_preset, true); char buf1[30]; sprintf_P(buf1, "%s %s %u", PGMStr_mqttRetainedSave, PGMStr_preset, preset); sendLog(buf1); } preset_lastPublished = preset; yield(); } yield(); // turnHeatingOn char ch_turnHeatingOn[5]; unsigned int currOnOffTime; if (turnHeatingOn) { strcpy(ch_turnHeatingOn, "on"); currOnOffTime = heatingOnTime; } else { strcpy(ch_turnHeatingOn, "off"); currOnOffTime = heatingOffTime; } if (force || turnHeatingOn != turnHeatingOn_lastPublished) { sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "heating"); mqttclient.publish(tmp_topic_out, ch_turnHeatingOn, confMqtt.mqtt_outRetain); turnHeatingOn_lastPublished = turnHeatingOn; } //sendLog(F("heating ON")); //char logBuf[40]; sprintf_P(logBuf, "%s: %s=%s (%s)", PGMStr_thermostat, PGMStr_heating, ch_turnHeatingOn, getTimeStringFromSeconds(currOnOffTime)); sendLog(logBuf, LOGLEVEL_INFO); // END turnHeatingOn yield(); char _buf[21]; sprintf(_buf, "%lu", heatingOnTime); sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "heatingOnTime"); mqttclient.publish(tmp_topic_out, _buf); sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "heatingOnTime_Hms"); mqttclient.publish(tmp_topic_out, getTimeStringFromSeconds(heatingOnTime)); yield(); sprintf(_buf, "%lu", heatingOffTime); sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "heatingOffTime"); mqttclient.publish(tmp_topic_out, _buf); sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "heatingOffTime_Hms"); mqttclient.publish(tmp_topic_out, getTimeStringFromSeconds(heatingOffTime)); publish_heatingLockTime(); publish_heatingPauseTime(); yield(); } void publish_heatingLockTime() { char _tmp_topic_out[50]; char _buf[21]; sprintf(_buf, "%i", heatingLockTime); sprintf(_tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "heatingLockTime"); mqttclient.publish(_tmp_topic_out, _buf); } void publish_heatingPauseTime() { char _tmp_topic_out[50]; char _buf[21]; sprintf(_buf, "%i", heatingPause); sprintf(_tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "heatingPause"); mqttclient.publish(_tmp_topic_out, _buf); } float currTemp_lastPublished; int currHum_lastPublished; void publishCurrentSensorValues(bool force = false) { if (lastTempUpdate != 0 && (millis() - lastTempUpdate) < 120000) { // ensure values are not too old char tmp_topic_out[50]; char temp_chararr[6]; char hum_chararr[4]; dtostrf(currTemp, 1, 1, temp_chararr); sprintf(hum_chararr, "%2i", currHum); // if (serialdebug) // { // Serial.print(F("sensors: {")); // Serial.print("'temp':"); // Serial.print(temp_chararr); // } if (force || currTemp != currTemp_lastPublished) { sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "temp"); mqttclient.publish(tmp_topic_out, temp_chararr, confMqtt.mqtt_outRetain_sensors); currTemp_lastPublished = currTemp; yield(); } // if (serialdebug) // { // Serial.print(F(",'hum':")); // Serial.print(currHum); // } if (force || currHum != currHum_lastPublished) { sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "hum"); mqttclient.publish(tmp_topic_out, hum_chararr, confMqtt.mqtt_outRetain_sensors); yield(); } dtostrf(currTemp_raw, 1, 1, temp_chararr); sprintf(hum_chararr, "%2i", currHum_raw); // if (serialdebug) // { // Serial.print(F(",'temp_raw':")); // Serial.print(temp_chararr); // } sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "temp_raw"); mqttclient.publish(tmp_topic_out, temp_chararr); yield(); // if (serialdebug) // { // Serial.print(F(",'hum_raw':")); // Serial.print(currHum_raw); // } sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "hum_raw"); mqttclient.publish(tmp_topic_out, hum_chararr); yield(); // if (serialdebug) // Serial.println("}"); char logBuf[101]; sprintf_P(logBuf, "SENS: temp=%2.1f, hum=%u, tempRaw=%2.1f, humRaw=%u", currTemp, currHum, currTemp_raw, currHum_raw); sendLog(logBuf, LOGLEVEL_INFO); } } void publishCurrentPIRValue() { char tmp_topic_out[50]; sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "PIR"); // PIR internal topic if (PIRSensorOn) { mqttclient.publish(tmp_topic_out, confAdd.mqtt_payload_pir_on); sendLog("SENS: PIR=ON", LOGLEVEL_INFO); } else { mqttclient.publish(tmp_topic_out, confAdd.mqtt_payload_pir_off); sendLog("SENS: PIR=OFF", LOGLEVEL_INFO); } // PIR additional topic if (strlen(confAdd.mqtt_topic_pir) >= 4) { if (PIRSensorOn) { mqttclient.publish(confAdd.mqtt_topic_pir, confAdd.mqtt_payload_pir_on); } else { mqttclient.publish(confAdd.mqtt_topic_pir, confAdd.mqtt_payload_pir_off); } } } void publishDeleteRetainedSavedStates() { // after "save states to MQTT retained" is switched off // old retained messages are deleted by publishing an empty retained message to the topics // to be called from config when confBas.saveToMqttRetained was changed to false if (!confBas.saveToMqttRetained) { mqttclient.publish(mqtt_topic_in_setTemp, "", true); mqttclient.publish(mqtt_topic_in_setMode, "", true); mqttclient.publish(mqtt_topic_in_setPreset, "", true); sendLog("MQTT: deleted retained saved states", LOGLEVEL_INFO); publishCurrentThermostatValues(true); // force publish current values again } } void publishDeleteRetainedOutMessages() { // after "MQTT-out retained" is switched off // old retained messages are deleted by publishing an empty retained message to the topics // to be called from config when confMqtt.mqtt_outRetain was changed to false if (!confMqtt.mqtt_outRetain) { char tmp_topic_out[50]; sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "setTemp"); mqttclient.publish(tmp_topic_out, "", true); sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "currSetTemp"); mqttclient.publish(tmp_topic_out, "", true); sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "mode"); mqttclient.publish(tmp_topic_out, "", true); sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "modeName"); mqttclient.publish(tmp_topic_out, "", true); sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "modeHA"); mqttclient.publish(tmp_topic_out, "", true); sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "preset"); mqttclient.publish(tmp_topic_out, "", true); sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "presetName"); mqttclient.publish(tmp_topic_out, "", true); sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "presetHA"); mqttclient.publish(tmp_topic_out, "", true); sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "heating"); mqttclient.publish(tmp_topic_out, "", true); sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "heatingOnTime"); mqttclient.publish(tmp_topic_out, "", true); sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "heatingOffTime"); mqttclient.publish(tmp_topic_out, "", true); sendLog("MQTT: deleted retained messages (states)", LOGLEVEL_INFO); publishCurrentThermostatValues(true); // force publish current values again } } void publishDeleteRetainedOutMessages_sensors() { // after "MQTT-out retained" is switched off // old retained messages are deleted by publishing an empty retained message to the topics // to be called from config when confMqtt.mqtt_outRetain was changed to false if (!confMqtt.mqtt_outRetain) { char tmp_topic_out[50]; sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "temp"); mqttclient.publish(tmp_topic_out, "", true); sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "hum"); mqttclient.publish(tmp_topic_out, "", true); sendLog("MQTT: deleted retained messages (sensors)", LOGLEVEL_INFO); publishCurrentSensorValues(true); // force publish current values again } }