private void checkHeaterTemps(
      List<ZoneState> zones, double heaterOutputLimit, SystemState state, List<Integer> nodes) {
    for (ZoneState zone : zones) {
      Unit unit = zone.getTopUnit();
      double setpoint = unit.getSetpoint();
      double lowerLimit = setpoint - unit.getLoWarn();
      double upperLimit = setpoint + unit.getHiWarn();
      double upperAlarm = setpoint + unit.getHiAlarm();
      double lowerAlarm = setpoint - unit.getLoAlarm();
      // test action with heaterFlag
      switch (zone.getTopHeaterFlag()) {
        case OFF:
          zone.setTopColor(GRAY);
          yellowFlag = true;
          break;
        case SET:
          zone.setTopColor(WHITE);
          yellowFlag = true;
          break;
        case POWER:
          zone.setTopColor(WHITE);
          yellowFlag = true;
          if (zone.getTopPercentOP() < heaterOutputLimit) zone.setTopHeaterFlag(HeaterFlag.HEATING);
          break;
        case HEATING:
          zone.setTopColor(WHITE);
          yellowFlag = true;
          if (zone.getTopTemp() > lowerLimit && zone.getTopTemp() < upperLimit) {
            zone.setTopHeaterFlag(HeaterFlag.ACTIVE);
          }
          break;
        case ACTIVE:
          if (zone.getTopTemp() < lowerAlarm || zone.getTopTemp() > upperAlarm) {
            redZone = true;
            if (!zone.getTopColor().equals(RED)) {
              zone.setTopColor(RED);
              if (state.equals(SystemState.SYSTEM_STATE_RUN_STARTUP)
                  || state.equals(SystemState.SYSTEM_STATE_RUN)) {
                OvenManager.getInstance().startCooldown(LightTowerState.ALARM_COOLDOWN.getTower());
                log.error(
                    "Zone: "
                        + zone.getId()
                        + " top heater out of alarm band: "
                        + zone.getTopTemp());
              }
            }
          } else if (zone.getTopTemp() < lowerLimit || zone.getTopTemp() > upperLimit) {
            yellowFlag = true;
            if (zone.getTopColor().equals(GREEN)) {
              zone.setTopColor(YELLOW);
              if (state.equals(SystemState.SYSTEM_STATE_RUN)) {
                CanComm.sendSystemState(
                    SystemState.SYSTEM_STATE_RUN_PAUSE, Can.OpId.OPER_SET.ordinal(), nodes);
                CanComm.setLightTower(Equip.LightTowerState.WARNING.getTower());
                log.error(
                    "Zone: "
                        + zone.getId()
                        + " top heater out of warning band: "
                        + zone.getTopTemp());
              }
            }
          } else {
            zone.setTopColor(GREEN);
          }
          break;
        default:
          break;
      }

      if (zone.isHeatZone()) {
        unit = zone.getBottomUnit();
        setpoint = unit.getSetpoint();
        upperLimit = setpoint + unit.getHiWarn();
        lowerLimit = setpoint - unit.getLoWarn();
        upperAlarm = setpoint + unit.getHiAlarm();
        lowerAlarm = setpoint - unit.getLoAlarm();
        // test action with heaterFlag
        switch (zone.getBottomHeaterFlag()) {
          case OFF:
            zone.setBottomColor(GRAY);
            yellowFlag = true;
            break;
          case SET:
            zone.setBottomColor(WHITE);
            yellowFlag = true;
            break;
          case POWER:
            zone.setBottomColor(WHITE);
            yellowFlag = true;
            if (zone.getBottomPercentOP() < heaterOutputLimit)
              zone.setBottomHeaterFlag(HeaterFlag.HEATING);
            break;
          case HEATING:
            zone.setBottomColor(WHITE);
            yellowFlag = true;
            if (zone.getBottomTemp() > lowerLimit && zone.getBottomTemp() < upperLimit) {
              zone.setBottomHeaterFlag(HeaterFlag.ACTIVE);
            }
            break;
          case ACTIVE:
            if (zone.getBottomTemp() < lowerAlarm || zone.getBottomTemp() > upperAlarm) {
              redZone = true;
              if (!zone.getBottomColor().equals(RED)) {
                zone.setBottomColor(RED);
                if (state.equals(SystemState.SYSTEM_STATE_RUN_STARTUP)
                    || state.equals(SystemState.SYSTEM_STATE_RUN)) {
                  OvenManager.getInstance()
                      .startCooldown(LightTowerState.ALARM_COOLDOWN.getTower());
                  log.error(
                      "Zone: "
                          + zone.getId()
                          + " bottom heater out of alarm band: "
                          + zone.getBottomTemp());
                }
              }
            } else if (zone.getBottomTemp() < lowerLimit || zone.getBottomTemp() > upperLimit) {
              yellowFlag = true;
              if (zone.getBottomColor().equals(GREEN)) {
                zone.setBottomColor(YELLOW);
                if (state.equals(SystemState.SYSTEM_STATE_RUN)) {
                  CanComm.sendSystemState(
                      SystemState.SYSTEM_STATE_RUN_PAUSE, Can.OpId.OPER_SET.ordinal(), nodes);
                  CanComm.setLightTower(Equip.LightTowerState.WARNING.getTower());
                  log.error(
                      "Zone: "
                          + zone.getId()
                          + " bottom heater out of warning band: "
                          + zone.getBottomTemp());
                }
              }
            } else {
              zone.setBottomColor(GREEN);
            }
            break;
          default:
            break;
        }
      }
    }
  }