thermostat.ino 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. void measureTempHum() {
  2. float tmpHum = round(dht.readHumidity()) + humCorrVal;
  3. float tmpTemp = dht.readTemperature() + tempCorrVal; // Read temperature as Celsius (the default)
  4. int tmpHumInt = tmpHum;
  5. // Check if any reads failed
  6. if (isnan(tmpHum) || isnan(tmpTemp)) {
  7. //Serial.println("Failed to read from DHT sensor!");
  8. sendStatus("Error: Failed to read from DHT sensor!");
  9. }
  10. else {
  11. if (tmpTemp < 50.0 && tmpTemp > -20.0) {
  12. // measurement is in range
  13. currTemp_raw = tmpTemp;
  14. currHum_raw = tmpHumInt;
  15. if ( lastTempUpdate > 0 && tmpTemp <= ( currTemp + 2.0 ) && tmpTemp >= ( currTemp - 2.0 ) ) {
  16. // temp has already been measured - only accept new measurement if it does not differ much from the last value
  17. //Temp = (Temp * (FilterFaktor -1) + AktuellerMesswert) / FilterFaktor;
  18. //temperature = tmpTemp;
  19. currTemp = (currTemp * 9 + tmpTemp) / 10; // filter
  20. currHum = (currHum * 9 + tmpHumInt) / 10; // filter
  21. lastTempUpdate = millis();
  22. }
  23. else if ( lastTempUpdate == 0 || (millis() - lastTempUpdate) > 300000 ) {
  24. // this is the first measurement or the last one is older than 5m - then accept this measurement
  25. currTemp = tmpTemp + tempCorrVal;
  26. currHum = tmpHumInt + humCorrVal;
  27. lastTempUpdate = millis();
  28. }
  29. // skip in all other cases
  30. //#ifdef DEBUG_VERBOSE
  31. // Serial.print("lastTempUpdate: ");
  32. // long lastTempUpdateDelta = millis() - lastTempUpdate;
  33. // Serial.print(lastTempUpdateDelta / 1000);
  34. // Serial.println("s ago");
  35. //#endif
  36. }
  37. }
  38. }
  39. void thermostat() {
  40. float curr_setTemp;
  41. // set target temp for heating mode
  42. if (heatingMode == 1) { // heating on - default/day mode
  43. curr_setTemp = setTemp;
  44. }
  45. else if (heatingMode == 2) { // heating of - night/reduction mode
  46. curr_setTemp = setTempLow;
  47. }
  48. char tmp_topic_out[50];
  49. if (heatingMode > 0 && turnHeatingOn) {
  50. heatingOnTime = (millis() - heatingLastOnMillis) / 1000;
  51. char buf[101];
  52. sprintf(buf, "heating on since %d s", heatingOnTime);
  53. sendStatus(buf);
  54. }
  55. else if (heatingMode > 0 && !turnHeatingOn) {
  56. heatingOffTime = (millis() - heatingLastOffMillis) / 1000;
  57. char buf[101];
  58. sprintf(buf, "heating off since %d s", heatingOffTime);
  59. sendStatus(buf);
  60. }
  61. //char tmp_topic_out[50];
  62. //sprintf(tmp_topic_out, "%s/%s", mqtt_topic_out, "heating");
  63. if ( lastTempUpdate != 0 && (millis() - lastTempUpdate) <= 120000 ) {
  64. // thermostat - only active if measured temperature is < 2 min old
  65. #ifdef DEBUG_VERBOSE
  66. Serial.print("thermostat, lastTempUpdate=");
  67. Serial.print(lastTempUpdate);
  68. Serial.print(", lastTempUpdate_delta=");
  69. long lastTempUpdateDelta = millis() - lastTempUpdate;
  70. Serial.println(lastTempUpdateDelta);
  71. #endif
  72. // thermostat with hysteresis
  73. if ( turnHeatingOn && currTemp >= (curr_setTemp - setTempDecreaseVal) ) {
  74. turnHeatingOn = false;
  75. heatingLastOffMillis = millis();
  76. digitalWrite(PIN_RELAIS, !RELAISONSTATE);
  77. updateDisplay();
  78. char buf[101];
  79. sprintf(buf, "switch heating OFF, on since %d s", heatingOnTime);
  80. sendStatus(buf);
  81. //Serial.println("heating off");
  82. //mqttclient.publish(tmp_topic_out, "off");
  83. publishCurrentThermostatValues();
  84. sendToDomoticz_Heating();
  85. }
  86. else if ( !turnHeatingOn && heatingMode > 0 && ( currTemp < (curr_setTemp - setTempDecreaseVal - hysteresis) ) && ( heatingOffTime > heatingMinOffTime ) ) {
  87. turnHeatingOn = true;
  88. heatingLastOnMillis = millis();
  89. digitalWrite(PIN_RELAIS, RELAISONSTATE);
  90. updateDisplay();
  91. char buf[101];
  92. sprintf(buf, "switch heating ON, off since %d s", heatingOffTime);
  93. sendStatus(buf);
  94. //Serial.println("heating on");
  95. //mqttclient.publish(tmp_topic_out, "on");
  96. publishCurrentThermostatValues();
  97. sendToDomoticz_Heating();
  98. }
  99. }
  100. else {
  101. if (turnHeatingOn) {
  102. digitalWrite(PIN_RELAIS, !RELAISONSTATE);
  103. turnHeatingOn = false;
  104. heatingLastOffMillis = millis();
  105. }
  106. if ( lastTempUpdate != 0 ) sendStatus("switch heating OFF, temp reading not yet available");
  107. else if ( (millis() - lastTempUpdate) > 120000 ) sendStatus("switch heating OFF, last temp reading too old");
  108. //mqttclient.publish(tmp_topic_out, "off");
  109. publishCurrentThermostatValues();
  110. sendToDomoticz_Heating();
  111. }
  112. }
  113. void toggleHeatingMode() {
  114. if (heatingMode > 0) {
  115. Serial.print("switch mode to ");
  116. if (heatingMode == 1) {
  117. heatingMode = 2;
  118. lastValueChange = millis();
  119. heatingModeAlreadySaved = false;
  120. }
  121. else if (heatingMode == 2) {
  122. heatingMode = 1;
  123. lastValueChange = millis();
  124. heatingModeAlreadySaved = false;
  125. }
  126. Serial.println(heatingMode);
  127. updateDisplay();
  128. }
  129. }
  130. void toggleThermostatOnOff() {
  131. if (heatingMode > 0) {
  132. heatingMode = 0;
  133. lastValueChange = millis();
  134. heatingModeAlreadySaved = false;
  135. }
  136. else {
  137. heatingMode = 1;
  138. lastValueChange = millis();
  139. heatingModeAlreadySaved = false;
  140. }
  141. updateDisplay();
  142. }
  143. void setTempStepUp() {
  144. if (heatingMode == 1) {
  145. Serial.println("setTemp +0.5");
  146. if ( setTemp <= (setTempMax - 0.5)) {
  147. setTemp += 0.5;
  148. lastValueChange = millis();
  149. setTempAlreadySaved = false;
  150. }
  151. updateDisplay();
  152. }
  153. }
  154. void setTempStepDown() {
  155. if (heatingMode == 1) {
  156. Serial.println("setTemp -0.5");
  157. if ( setTemp >= (setTempMin + 0.5)) {
  158. setTemp -= 0.5;
  159. lastValueChange = millis();
  160. setTempAlreadySaved = false;
  161. }
  162. updateDisplay();
  163. }
  164. }
  165. void setTempTo(float setTo) {
  166. bool changes = false;
  167. if (setTo >= setTempMin && setTo <= setTempMax) {
  168. setTemp = setTo;
  169. changes = true;
  170. }
  171. else if (setTo > setTempMax) {
  172. setTemp = setTempMax;
  173. changes = true;
  174. }
  175. else if (setTo < setTempMin) {
  176. setTemp = setTempMin;
  177. changes = true;
  178. }
  179. if (changes) {
  180. lastValueChange = millis();
  181. setTempAlreadySaved = false;
  182. updateDisplay();
  183. publishCurrentThermostatValues();
  184. }
  185. }
  186. void setTempLowTo(float setTo) {
  187. bool changes = false;
  188. if (setTo >= setTempLowMin && setTo <= setTempLowMax) {
  189. setTempLow = setTo;
  190. changes = true;
  191. }
  192. else if (setTo > setTempLowMax) {
  193. setTempLow = setTempLowMax;
  194. changes = true;
  195. }
  196. else if (setTo < setTempLowMin) {
  197. setTempLow = setTempLowMin;
  198. changes = true;
  199. }
  200. if (changes) {
  201. updateDisplay();
  202. publishCurrentThermostatValues();
  203. }
  204. }
  205. void setHeatingmodeTo(byte setTo) {
  206. bool changes = false;
  207. switch (setTo) {
  208. case 0:
  209. heatingMode = 0;
  210. changes = true;
  211. break;
  212. case 1:
  213. heatingMode = 1;
  214. changes = true;
  215. break;
  216. case 2:
  217. heatingMode = 2;
  218. changes = true;
  219. break;
  220. }
  221. if (changes) {
  222. lastValueChange = millis();
  223. heatingModeAlreadySaved = false;
  224. updateDisplay();
  225. publishCurrentThermostatValues();
  226. }
  227. }
  228. void checkValuesChanged() { // called every second by everySecond() / misc.ino
  229. if ( !setTempAlreadySaved || !heatingModeAlreadySaved ) {
  230. if ( (millis() - lastValueChange) > saveValuesTimeout ) { // value was changed 5s ago. now save if auto-save enabled
  231. if (!setTempAlreadySaved) {
  232. lastUpdate_setTemp = millis();
  233. sendToDomoticz_thermostat();
  234. if (autoSaveSetTemp && setTemp != setTempSaved) {
  235. saveSetTemp();
  236. sendStatus("setTemp autosave done");
  237. }
  238. setTempAlreadySaved = true;
  239. }
  240. if (!heatingModeAlreadySaved) {
  241. lastUpdate_heatingMode = millis();
  242. sendToDomoticz_heatingMode();
  243. if (autoSaveHeatingMode && heatingMode != heatingModeSaved) {
  244. saveHeatingMode();
  245. sendStatus("heatingMode autosave done");
  246. }
  247. heatingModeAlreadySaved = true;
  248. }
  249. }
  250. }
  251. }