thermostat.ino 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  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. else if (heatingMode == 3) { // heating of - night/reduction mode
  49. curr_setTemp = setTempLow2;
  50. }
  51. char tmp_topic_out[50];
  52. if (heatingMode > 0 && turnHeatingOn) {
  53. heatingOnTime = (millis() - heatingLastOnMillis) / 1000;
  54. char buf[101];
  55. sprintf(buf, "heating on since %d s", heatingOnTime);
  56. sendStatus(buf);
  57. }
  58. else if (heatingMode > 0 && !turnHeatingOn) {
  59. heatingOffTime = (millis() - heatingLastOffMillis) / 1000;
  60. char buf[101];
  61. sprintf(buf, "heating off since %d s", heatingOffTime);
  62. sendStatus(buf);
  63. }
  64. //char tmp_topic_out[50];
  65. //sprintf(tmp_topic_out, "%s/%s", mqtt_topic_out, "heating");
  66. if ( lastTempUpdate != 0 && (millis() - lastTempUpdate) <= 120000 ) {
  67. // thermostat - only active if measured temperature is < 2 min old
  68. #ifdef DEBUG_VERBOSE
  69. Serial.print("thermostat, lastTempUpdate=");
  70. Serial.print(lastTempUpdate);
  71. Serial.print(", lastTempUpdate_delta=");
  72. long lastTempUpdateDelta = millis() - lastTempUpdate;
  73. Serial.println(lastTempUpdateDelta);
  74. #endif
  75. // thermostat with hysteresis
  76. if ( turnHeatingOn && currTemp >= (curr_setTemp - setTempDecreaseVal) ) {
  77. turnHeatingOn = false;
  78. heatingLastOffMillis = millis();
  79. digitalWrite(PIN_RELAIS, !RELAISONSTATE);
  80. updateDisplay();
  81. char buf[101];
  82. sprintf(buf, "switch heating OFF, on since %d s", heatingOnTime);
  83. sendStatus(buf);
  84. //Serial.println("heating off");
  85. //mqttclient.publish(tmp_topic_out, "off");
  86. publishCurrentThermostatValues();
  87. sendToDomoticz_Heating();
  88. }
  89. else if ( !turnHeatingOn && heatingMode > 0 && ( currTemp < (curr_setTemp - setTempDecreaseVal - hysteresis) ) && ( heatingOffTime > heatingMinOffTime ) ) {
  90. turnHeatingOn = true;
  91. heatingLastOnMillis = millis();
  92. digitalWrite(PIN_RELAIS, RELAISONSTATE);
  93. updateDisplay();
  94. char buf[101];
  95. sprintf(buf, "switch heating ON, off since %d s", heatingOffTime);
  96. sendStatus(buf);
  97. //Serial.println("heating on");
  98. //mqttclient.publish(tmp_topic_out, "on");
  99. publishCurrentThermostatValues();
  100. sendToDomoticz_Heating();
  101. }
  102. }
  103. else {
  104. if (turnHeatingOn) {
  105. digitalWrite(PIN_RELAIS, !RELAISONSTATE);
  106. turnHeatingOn = false;
  107. heatingLastOffMillis = millis();
  108. }
  109. if ( lastTempUpdate != 0 ) sendStatus("switch heating OFF, temp reading not yet available");
  110. else if ( (millis() - lastTempUpdate) > 120000 ) sendStatus("switch heating OFF, last temp reading too old");
  111. //mqttclient.publish(tmp_topic_out, "off");
  112. publishCurrentThermostatValues();
  113. sendToDomoticz_Heating();
  114. }
  115. }
  116. void toggleHeatingMode() {
  117. if (heatingMode > 0) {
  118. Serial.print("switch mode to ");
  119. if (heatingMode == 1) {
  120. heatingMode = 2;
  121. lastValueChange = millis();
  122. heatingModeAlreadySaved = false;
  123. }
  124. else if (heatingMode == 2) {
  125. heatingMode = 3;
  126. lastValueChange = millis();
  127. heatingModeAlreadySaved = false;
  128. }
  129. else if (heatingMode == 3) {
  130. heatingMode = 1;
  131. lastValueChange = millis();
  132. heatingModeAlreadySaved = false;
  133. }
  134. Serial.print(heatingMode);
  135. Serial.print(" - \"");
  136. Serial.print(currentModeName);
  137. Serial.println("\"");
  138. updateDisplay();
  139. updateCurrentHeatingModeName();
  140. }
  141. }
  142. void updateCurrentHeatingModeName() {
  143. if(heatingMode == 0) strlcpy(currentModeName, modename0, 14);
  144. else if(heatingMode == 1) strlcpy(currentModeName, modename1, 14);
  145. else if(heatingMode == 2) strlcpy(currentModeName, modename2, 14);
  146. else if(heatingMode == 3) strlcpy(currentModeName, modename3, 14);
  147. }
  148. void toggleThermostatOnOff() {
  149. if (heatingMode > 0) {
  150. heatingMode = 0;
  151. lastValueChange = millis();
  152. heatingModeAlreadySaved = false;
  153. }
  154. else {
  155. heatingMode = 1;
  156. lastValueChange = millis();
  157. heatingModeAlreadySaved = false;
  158. }
  159. updateDisplay();
  160. updateCurrentHeatingModeName();
  161. }
  162. void setTempStepUp() {
  163. if (heatingMode == 1) {
  164. Serial.println("setTemp +0.5");
  165. if ( setTemp <= (setTempMax - 0.5)) {
  166. setTemp += 0.5;
  167. lastValueChange = millis();
  168. setTempAlreadySaved = false;
  169. }
  170. updateDisplay();
  171. }
  172. }
  173. void setTempStepDown() {
  174. if (heatingMode == 1) {
  175. Serial.println("setTemp -0.5");
  176. if ( setTemp >= (setTempMin + 0.5)) {
  177. setTemp -= 0.5;
  178. lastValueChange = millis();
  179. setTempAlreadySaved = false;
  180. }
  181. updateDisplay();
  182. }
  183. }
  184. void setTempTo(float setTo) {
  185. bool changes = false;
  186. if (setTo >= setTempMin && setTo <= setTempMax) {
  187. setTemp = setTo;
  188. changes = true;
  189. }
  190. else if (setTo > setTempMax) {
  191. setTemp = setTempMax;
  192. changes = true;
  193. }
  194. else if (setTo < setTempMin) {
  195. setTemp = setTempMin;
  196. changes = true;
  197. }
  198. if (changes) {
  199. lastValueChange = millis();
  200. setTempAlreadySaved = false;
  201. updateDisplay();
  202. publishCurrentThermostatValues();
  203. }
  204. }
  205. void setTempLowTo(float setTo) {
  206. bool changes = false;
  207. if (setTo >= setTempLowMin && setTo <= setTempLowMax) {
  208. setTempLow = setTo;
  209. changes = true;
  210. }
  211. else if (setTo > setTempLowMax) {
  212. setTempLow = setTempLowMax;
  213. changes = true;
  214. }
  215. else if (setTo < setTempLowMin) {
  216. setTempLow = setTempLowMin;
  217. changes = true;
  218. }
  219. if (changes) {
  220. updateDisplay();
  221. publishCurrentThermostatValues();
  222. }
  223. }
  224. void setTempLow2To(float setTo) {
  225. bool changes = false;
  226. if (setTo >= setTempLowMin && setTo <= setTempLowMax) {
  227. setTempLow2 = setTo;
  228. changes = true;
  229. }
  230. else if (setTo > setTempLowMax) {
  231. setTempLow2 = setTempLowMax;
  232. changes = true;
  233. }
  234. else if (setTo < setTempLowMin) {
  235. setTempLow2 = setTempLowMin;
  236. changes = true;
  237. }
  238. if (changes) {
  239. updateDisplay();
  240. publishCurrentThermostatValues();
  241. }
  242. }
  243. void setHeatingmodeTo(byte setTo) {
  244. bool changes = false;
  245. switch (setTo) {
  246. case 0:
  247. heatingMode = 0;
  248. changes = true;
  249. break;
  250. case 1:
  251. heatingMode = 1;
  252. changes = true;
  253. break;
  254. case 2:
  255. heatingMode = 2;
  256. changes = true;
  257. break;
  258. case 3:
  259. heatingMode = 3;
  260. changes = true;
  261. break;
  262. }
  263. if (changes) {
  264. lastValueChange = millis();
  265. heatingModeAlreadySaved = false;
  266. updateCurrentHeatingModeName();
  267. updateDisplay();
  268. publishCurrentThermostatValues();
  269. }
  270. }
  271. void checkValuesChanged() { // called every second by everySecond() / misc.ino
  272. if ( !setTempAlreadySaved || !heatingModeAlreadySaved ) {
  273. if ( (millis() - lastValueChange) > saveValuesTimeout ) { // value was changed 5s ago. now save if auto-save enabled
  274. publishCurrentThermostatValues();
  275. if (!setTempAlreadySaved) {
  276. lastUpdate_setTemp = millis();
  277. sendToDomoticz_thermostat();
  278. if (autoSaveSetTemp && setTemp != setTempSaved) {
  279. saveSetTemp();
  280. sendStatus("setTemp autosave done");
  281. }
  282. setTempAlreadySaved = true;
  283. }
  284. if (!heatingModeAlreadySaved) {
  285. lastUpdate_heatingMode = millis();
  286. sendToDomoticz_heatingMode();
  287. if (autoSaveHeatingMode && heatingMode != heatingModeSaved) {
  288. saveHeatingMode();
  289. sendStatus("heatingMode autosave done");
  290. }
  291. heatingModeAlreadySaved = true;
  292. }
  293. }
  294. }
  295. }