mqtt_out.ino 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. float setTemp_lastPublished;
  2. float currSetTemp_lastPublished;
  3. int heatingMode_lastPublished;
  4. int preset_lastPublished;
  5. bool turnHeatingOn_lastPublished;
  6. void publishCurrentThermostatValues(bool force = false)
  7. {
  8. // most values are only published if changed
  9. // call publishCurrentThermostatValues(true); to force publishing an update
  10. char tmp_topic_out[50];
  11. char ch_setTemp[6];
  12. char ch_currSetTemp[6];
  13. dtostrf(setTemp, 1, 1, ch_setTemp);
  14. dtostrf(currSetTemp, 1, 1, ch_currSetTemp);
  15. updateCurrentHeatingModeName();
  16. updateCurrentPresetName();
  17. // if (serialdebug)
  18. // {
  19. // Serial.print(F("thermostat: {"));
  20. // Serial.print(F("'heatingMode':"));
  21. // Serial.print(heatingMode);
  22. // Serial.print(F(",'preset':"));
  23. // Serial.print(preset);
  24. // Serial.print(F(",'setTemp':"));
  25. // Serial.print(ch_setTemp);
  26. // Serial.print(F(",'currSetTemp':"));
  27. // Serial.print(ch_currSetTemp);
  28. // Serial.println("}");
  29. // }
  30. char logBuf[101];
  31. 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);
  32. sendLog(logBuf, LOGLEVEL_INFO);
  33. // Serial.print(F("thermostat: {"));
  34. // Serial.print(F("'heatingMode':"));
  35. // Serial.print(heatingMode);
  36. // Serial.print(F(",'preset':"));
  37. // Serial.print(preset);
  38. // Serial.print(F(",'setTemp':"));
  39. // Serial.print(ch_setTemp);
  40. // Serial.print(F(",'currSetTemp':"));
  41. // Serial.print(ch_currSetTemp);
  42. // Serial.println("}");
  43. // }
  44. if (force || !confBas.saveToMqttRetained || setTemp != setTemp_lastPublished)
  45. {
  46. sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "setTemp");
  47. mqttclient.publish(tmp_topic_out, ch_setTemp, confMqtt.mqtt_outRetain);
  48. if (confBas.saveToMqttRetained && setTemp != setTemp_lastPublished)
  49. {
  50. //Serial.print("MQTT retained save setTemp: ");
  51. //Serial.println(ch_setTemp);
  52. char buf1[30];
  53. sprintf_P(buf1, "%s %s %2.1f", PGMStr_mqttRetainedSave, PGMStr_setTemp, setTemp);
  54. sendLog(buf1);
  55. mqttclient.publish(mqtt_topic_in_setTemp, ch_setTemp, true);
  56. }
  57. setTemp_lastPublished = setTemp;
  58. yield();
  59. }
  60. if (force || currSetTemp != currSetTemp_lastPublished || !confMqtt.mqtt_outRetain)
  61. {
  62. sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "currSetTemp");
  63. mqttclient.publish(tmp_topic_out, ch_currSetTemp, confMqtt.mqtt_outRetain);
  64. currSetTemp_lastPublished = currSetTemp;
  65. yield();
  66. }
  67. if (force || !confBas.saveToMqttRetained || heatingMode != heatingMode_lastPublished)
  68. {
  69. sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "mode");
  70. char ch_heatingMode[3];
  71. sprintf(ch_heatingMode, "%d", heatingMode);
  72. mqttclient.publish(tmp_topic_out, ch_heatingMode, confMqtt.mqtt_outRetain);
  73. sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "modeName");
  74. mqttclient.publish(tmp_topic_out, currentModeName, confMqtt.mqtt_outRetain);
  75. if (confBas.saveToMqttRetained && heatingMode != heatingMode_lastPublished)
  76. {
  77. //Serial.print("MQTT retained save setMode: ");
  78. //Serial.println(ch_heatingMode);
  79. char buf1[30];
  80. sprintf_P(buf1, "%s %s %u", PGMStr_mqttRetainedSave, PGMStr_heatingMode, heatingMode);
  81. sendLog(buf1);
  82. mqttclient.publish(mqtt_topic_in_setMode, ch_heatingMode, true);
  83. }
  84. heatingMode_lastPublished = heatingMode;
  85. yield();
  86. }
  87. if (force || !confBas.saveToMqttRetained || preset != preset_lastPublished)
  88. {
  89. sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "preset");
  90. char ch_preset[3];
  91. sprintf(ch_preset, "%d", preset);
  92. mqttclient.publish(tmp_topic_out, ch_preset, confMqtt.mqtt_outRetain);
  93. sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "presetName");
  94. mqttclient.publish(tmp_topic_out, currentPresetName, confMqtt.mqtt_outRetain);
  95. sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "presetHA");
  96. if (preset == 0)
  97. mqttclient.publish(tmp_topic_out, "none", confMqtt.mqtt_outRetain);
  98. else
  99. mqttclient.publish(tmp_topic_out, currentPresetName, confMqtt.mqtt_outRetain);
  100. if (confBas.saveToMqttRetained && preset != preset_lastPublished)
  101. {
  102. //Serial.print("MQTT retained save setPreset: ");
  103. //Serial.println(ch_preset);
  104. char buf1[30];
  105. sprintf_P(buf1, "%s %s %u", PGMStr_mqttRetainedSave, PGMStr_preset, preset);
  106. sendLog(buf1);
  107. mqttclient.publish(mqtt_topic_in_setPreset, ch_preset, true);
  108. }
  109. preset_lastPublished = preset;
  110. yield();
  111. }
  112. yield();
  113. // turnHeatingOn
  114. char ch_turnHeatingOn[5];
  115. unsigned int currOnOffTime;
  116. if (turnHeatingOn)
  117. {
  118. strcpy(ch_turnHeatingOn, "on");
  119. currOnOffTime = heatingOnTime;
  120. }
  121. else
  122. {
  123. strcpy(ch_turnHeatingOn, "off");
  124. currOnOffTime = heatingOffTime;
  125. }
  126. if (force || turnHeatingOn != turnHeatingOn_lastPublished)
  127. {
  128. sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "heating");
  129. mqttclient.publish(tmp_topic_out, ch_turnHeatingOn, confMqtt.mqtt_outRetain);
  130. turnHeatingOn_lastPublished = turnHeatingOn;
  131. }
  132. //sendLog(F("heating ON"));
  133. //char logBuf[40];
  134. sprintf_P(logBuf, "%s: %s=%s (%us)", PGMStr_thermostat, PGMStr_heating, ch_turnHeatingOn, currOnOffTime);
  135. sendLog(logBuf, LOGLEVEL_INFO);
  136. // END turnHeatingOn
  137. yield();
  138. char buf[101];
  139. sprintf(buf, "%lu", heatingOnTime);
  140. sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "heatingOnTime");
  141. mqttclient.publish(tmp_topic_out, buf);
  142. yield();
  143. sprintf(buf, "%lu", heatingOffTime);
  144. sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "heatingOffTime");
  145. mqttclient.publish(tmp_topic_out, buf);
  146. yield();
  147. }
  148. float currTemp_lastPublished;
  149. int currHum_lastPublished;
  150. void publishCurrentSensorValues(bool force = false)
  151. {
  152. if (lastTempUpdate != 0 && (millis() - lastTempUpdate) < 120000)
  153. { // ensure values are not too old
  154. char tmp_topic_out[50];
  155. char temp_chararr[6];
  156. char hum_chararr[4];
  157. dtostrf(currTemp, 1, 1, temp_chararr);
  158. sprintf(hum_chararr, "%2i", currHum);
  159. // if (serialdebug)
  160. // {
  161. // Serial.print(F("sensors: {"));
  162. // Serial.print("'temp':");
  163. // Serial.print(temp_chararr);
  164. // }
  165. if (force || currTemp != currTemp_lastPublished)
  166. {
  167. sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "temp");
  168. mqttclient.publish(tmp_topic_out, temp_chararr, confMqtt.mqtt_outRetain_sensors);
  169. currTemp_lastPublished = currTemp;
  170. yield();
  171. }
  172. // if (serialdebug)
  173. // {
  174. // Serial.print(F(",'hum':"));
  175. // Serial.print(currHum);
  176. // }
  177. if (force || currHum != currHum_lastPublished)
  178. {
  179. sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "hum");
  180. mqttclient.publish(tmp_topic_out, hum_chararr, confMqtt.mqtt_outRetain_sensors);
  181. yield();
  182. }
  183. dtostrf(currTemp_raw, 1, 1, temp_chararr);
  184. sprintf(hum_chararr, "%2i", currHum_raw);
  185. // if (serialdebug)
  186. // {
  187. // Serial.print(F(",'temp_raw':"));
  188. // Serial.print(temp_chararr);
  189. // }
  190. sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "temp_raw");
  191. mqttclient.publish(tmp_topic_out, temp_chararr);
  192. yield();
  193. // if (serialdebug)
  194. // {
  195. // Serial.print(F(",'hum_raw':"));
  196. // Serial.print(currHum_raw);
  197. // }
  198. sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "hum_raw");
  199. mqttclient.publish(tmp_topic_out, hum_chararr);
  200. yield();
  201. // if (serialdebug)
  202. // Serial.println("}");
  203. char logBuf[101];
  204. sprintf_P(logBuf, "SENS: temp=%2.1f, hum=%u, tempRaw=%2.1f, humRaw=%u", currTemp, currHum, currTemp_raw, currHum_raw);
  205. sendLog(logBuf, LOGLEVEL_INFO);
  206. }
  207. }
  208. void publishCurrentPIRValue()
  209. {
  210. char tmp_topic_out[50];
  211. sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "PIR");
  212. // PIR internal topic
  213. if (PIRSensorOn)
  214. {
  215. mqttclient.publish(tmp_topic_out, confAdd.mqtt_payload_pir_on);
  216. sendLog("SENS: PIR=ON", LOGLEVEL_INFO);
  217. }
  218. else
  219. {
  220. mqttclient.publish(tmp_topic_out, confAdd.mqtt_payload_pir_off);
  221. sendLog("SENS: PIR=OFF", LOGLEVEL_INFO);
  222. }
  223. // PIR additional topic
  224. if (strlen(confAdd.mqtt_topic_pir) >= 4)
  225. {
  226. if (PIRSensorOn)
  227. {
  228. mqttclient.publish(confAdd.mqtt_topic_pir, confAdd.mqtt_payload_pir_on);
  229. }
  230. else
  231. {
  232. mqttclient.publish(confAdd.mqtt_topic_pir, confAdd.mqtt_payload_pir_off);
  233. }
  234. }
  235. }
  236. void publishDeleteRetainedSavedStates()
  237. {
  238. // after "save states to MQTT retained" is switched off
  239. // old retained messages are deleted by publishing an empty retained message to the topics
  240. // to be called from config when confBas.saveToMqttRetained was changed to false
  241. if (!confBas.saveToMqttRetained)
  242. {
  243. mqttclient.publish(mqtt_topic_in_setTemp, "", true);
  244. mqttclient.publish(mqtt_topic_in_setMode, "", true);
  245. mqttclient.publish(mqtt_topic_in_setPreset, "", true);
  246. sendLog("MQTT: deleted retained saved states", LOGLEVEL_INFO);
  247. publishCurrentThermostatValues(true); // force publish current values again
  248. }
  249. }
  250. void publishDeleteRetainedOutMessages()
  251. {
  252. // after "MQTT-out retained" is switched off
  253. // old retained messages are deleted by publishing an empty retained message to the topics
  254. // to be called from config when confMqtt.mqtt_outRetain was changed to false
  255. if (!confMqtt.mqtt_outRetain)
  256. {
  257. char tmp_topic_out[50];
  258. sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "setTemp");
  259. mqttclient.publish(tmp_topic_out, "", true);
  260. sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "currSetTemp");
  261. mqttclient.publish(tmp_topic_out, "", true);
  262. sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "mode");
  263. mqttclient.publish(tmp_topic_out, "", true);
  264. sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "modeName");
  265. mqttclient.publish(tmp_topic_out, "", true);
  266. sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "preset");
  267. mqttclient.publish(tmp_topic_out, "", true);
  268. sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "presetName");
  269. mqttclient.publish(tmp_topic_out, "", true);
  270. sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "presetHA");
  271. mqttclient.publish(tmp_topic_out, "", true);
  272. sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "heating");
  273. mqttclient.publish(tmp_topic_out, "", true);
  274. sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "heatingOnTime");
  275. mqttclient.publish(tmp_topic_out, "", true);
  276. sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "heatingOffTime");
  277. mqttclient.publish(tmp_topic_out, "", true);
  278. sendLog("MQTT: deleted retained messages (states)", LOGLEVEL_INFO);
  279. publishCurrentThermostatValues(true); // force publish current values again
  280. }
  281. }
  282. void publishDeleteRetainedOutMessages_sensors()
  283. {
  284. // after "MQTT-out retained" is switched off
  285. // old retained messages are deleted by publishing an empty retained message to the topics
  286. // to be called from config when confMqtt.mqtt_outRetain was changed to false
  287. if (!confMqtt.mqtt_outRetain)
  288. {
  289. char tmp_topic_out[50];
  290. sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "temp");
  291. mqttclient.publish(tmp_topic_out, "", true);
  292. sprintf(tmp_topic_out, "%s/%s", confMqtt.mqtt_topic_out, "hum");
  293. mqttclient.publish(tmp_topic_out, "", true);
  294. sendLog("MQTT: deleted retained messages (sensors)", LOGLEVEL_INFO);
  295. publishCurrentSensorValues(true); // force publish current values again
  296. }
  297. }