// Service: called once per second void HVAC::service() { tempCheck(); static uint16_t old[4]; if(m_remoteTimer) // let user change values for some time before sending { if(--m_remoteTimer == 0) { if(old[0] != ee.coolTemp[0]) sendCmd("cooltempl", old[0] = ee.coolTemp[0]); if(old[1] != ee.coolTemp[1]) sendCmd("cooltemph", old[1] = ee.coolTemp[1]); if(old[2] != ee.heatTemp[0]) sendCmd("heattempl", old[2] = ee.heatTemp[0]); if(old[3] != ee.heatTemp[1]) sendCmd("heattemph", old[3] = ee.heatTemp[1]); if(ee.heatMode != m_setHeat) sendCmd("heatmode", ee.heatMode = m_setHeat); if(ee.Mode != m_setMode) sendCmd("mode", ee.Mode = m_setMode); } } }
// Service: called once per second void HVAC::service() { if(m_bFanRunning || m_bRunning || m_furnaceFan) // furance runs fan seperately { filterInc(); if(m_fanOnTimer < 0xFFFF) m_fanOnTimer++; // running time counter if(m_furnaceFan) // fake fan status for furnace fan m_furnaceFan--; } if(m_fanPostTimer) // Fan continuation delay { if(--m_fanPostTimer == 0) if(!m_bRunning && m_bFanMode == false) // Ensure system isn't running and fanMode is auto fanSwitch(false); } if(m_overrideTimer) // User temp override timer { if(--m_overrideTimer == 0) { m_ovrTemp = 0; calcTargetTemp(m_EE.Mode); // recalc normal set temp } } if(m_bRunning) { m_runTotal++; if(++m_cycleTimer < 20) // Block changes for at least 20 seconds after a start return; if(m_cycleTimer >= m_EE.cycleMax) // running too long (todo: skip for eHeat?) { m_bStop = true; m_notif = Note_CycleLimit; // cycle limit hit } } else { m_idleTimer++; // Time since stopped } if(m_setMode != m_EE.Mode || m_setHeat != m_EE.heatMode) // requested HVAC mode change { if(m_bRunning) // cycleTimer is already > 20s here m_bStop = true; if(m_idleTimer >= 5) { m_EE.heatMode = m_setHeat; m_EE.Mode = m_setMode; // User may be cycling through modes (give 5s) calcTargetTemp(m_EE.Mode); } } int8_t hm = (m_EE.heatMode == Heat_Auto) ? m_AutoHeat : m_EE.heatMode; // true heat mode int8_t mode = (m_EE.Mode == Mode_Auto) ? m_AutoMode : m_EE.Mode; // tue heat/cool mode if(m_bStart && !m_bRunning) // Start signal occurred { m_bStart = false; switch(mode) { case Mode_Cool: fanSwitch(true); if(digitalRead(P_REV) != HIGH) { digitalWrite(P_REV, HIGH); // set heatpump to cool (if heats, reverse this) delay(3000); // if no heatpump, remove } digitalWrite(P_COOL, HIGH); break; case Mode_Heat: if(hm) // gas { digitalWrite(P_HEAT, HIGH); } else { fanSwitch(true); if(digitalRead(P_REV) != LOW) // set heatpump to heat (if heats, reverse this) { digitalWrite(P_REV, LOW); delay(3000); } digitalWrite(P_COOL, HIGH); } break; } m_bRunning = true; if(m_EE.humidMode == HM_Run) humidSwitch(true); m_cycleTimer = 0; } if(m_bStop && m_bRunning) // Stop signal occurred { m_bStop = false; digitalWrite(P_COOL, LOW); digitalWrite(P_HEAT, LOW); if(m_EE.humidMode == HM_Run) // shut off after heat/cool phase humidSwitch(false); if(m_bFanRunning && m_bFanMode == false) // Note: furnace manages fan { if(m_EE.fanPostDelay[digitalRead(P_REV)]) // leave fan running to circulate air longer m_fanPostTimer = m_EE.fanPostDelay[digitalRead(P_REV)]; // P_REV == true if heating else fanSwitch(false); } if(mode == Mode_Heat && hm) // count run time as fan time in winter { // furnace post fan is 120 seconds m_furnaceFan = FF_DELAY; } m_bRunning = false; m_idleTimer = 0; } tempCheck(); }